replace — php strtok не работает, если разделитель является первым символом в строке?

У меня есть список строк, которые могут содержать или не содержать определенный разделитель, и использовать strtok удалить все после этого разделителя в строке, например:

$href = "test#content";
$href = strtok($href,'#');
echo $href;

выходы:

test

Я столкнулся с проблемой, когда строка начинается с разделителя:

$href = "#content";
$href = strtok($href,'#');
echo $href;

Вместо желаемого вывода », он выводит:

content

Почему это не работает так же, как в первом примере, и каков наиболее эффективный способ получить желаемые результаты с наименьшим количеством дополнительного кода?

0

Решение

В этом случае вы можете использовать strstr (), для возврата левой части разделителя, когда третий ($before_needle) передается аргумент, по умолчанию верный сайт возвращается. Чтобы проверить, существует ли разделитель или нет, вы можете использовать preg_match () чтобы выполнить задание, выполнить регулярное выражение, вернуть true если шаблон находится или ложь для сбоя.

$href = "test#content";

if(preg_match('/#/', $href)){
echo strstr($href, '#', true); //test
}else{
echo 'delimiter not found';
}
2

Другие решения

Если вы хотите вернуть все раньше#«Тогда вы можете использовать взорваться.

Поведение при обнаружении пустой части изменилось в PHP 4.1.0.
старое поведение вернуло пустую строку, а новое, правильное,
Поведение просто пропускает часть строки.

ТЕСТ 1 (https://3v4l.org/4lP5u):

$href = "#content";
$href = explode('#', $href);
echo $href['0'];

//returns ''

ТЕСТ 2 (https://3v4l.org/ov9Yl):

$href = "test#content";
$href = explode('#', $href);
echo $href['0'];

//returns 'test'

РЕДАКТИРОВАТЬ:

WHOOPs я добавил неправильную ссылку в TEST 2 Например, теперь обновлена ​​ссылка.

Согласно вашему комментарию

к сожалению, я не могу разорвать маршрут, так как переменная $ href будет
повторно используется позже и не может быть массивом. Также есть неверный вывод
в примере в вашей второй ссылке, потому что он повторяет $ href [‘1’] вместо $ href [‘0’]

вы могли бы:

ТЕСТ 3 (https://3v4l.org/uWPOk):

$href = "test#content";
$href = explode('#', $href);
$href = $href['0'];
echo $href;

ТЕСТ 4 (https://3v4l.org/rtIJ0):

Это проверяет, содержит ли строка # и взрывает его еще $href остается такой же

$href = "test#content";

if (strpos($href, '#') !== FALSE){
$href = explode('#', $href);
$href = $href['0'];
echo $href;
}else{
echo "$href";
}
1

возможно preg_split может быть полезным в этой ситуации:

$href = "#content";
$pieces=preg_split('@#@',$href);
echo $pieces[0];/* Empty */
echo $pieces[1];/*content*/
0

я не думаю, что strtok должен быть использован таким образом …

прочитайте руководство здесь http://php.net/manual/en/function.strtok.php

но я бы использовал что-то вроде этого …

echo substr($href, 0, strpos($href, '#'));
0

если вы хотите строку раньше # ты должен использовать explode. Обойти для вашего подхода может быть что-то вроде этого:

<?php
$href = "#content";
if($href[0]=='#'){//check the first index character
$href="''".$href;
}
$href = strtok($href,'#');
echo $href;

?>
0
По вопросам рекламы [email protected]