У меня есть список строк, которые могут содержать или не содержать определенный разделитель, и использовать strtok удалить все после этого разделителя в строке, например:
$href = "test#content";
$href = strtok($href,'#');
echo $href;
выходы:
test
Я столкнулся с проблемой, когда строка начинается с разделителя:
$href = "#content";
$href = strtok($href,'#');
echo $href;
Вместо желаемого вывода », он выводит:
content
Почему это не работает так же, как в первом примере, и каков наиболее эффективный способ получить желаемые результаты с наименьшим количеством дополнительного кода?
В этом случае вы можете использовать strstr (), для возврата левой части разделителя, когда третий ($before_needle
) передается аргумент, по умолчанию верный сайт возвращается. Чтобы проверить, существует ли разделитель или нет, вы можете использовать preg_match () чтобы выполнить задание, выполнить регулярное выражение, вернуть true
если шаблон находится или ложь для сбоя.
$href = "test#content";
if(preg_match('/#/', $href)){
echo strstr($href, '#', true); //test
}else{
echo 'delimiter not found';
}
Если вы хотите вернуть все раньше#
«Тогда вы можете использовать взорваться.
Поведение при обнаружении пустой части изменилось в 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";
}
возможно preg_split
может быть полезным в этой ситуации:
$href = "#content";
$pieces=preg_split('@#@',$href);
echo $pieces[0];/* Empty */
echo $pieces[1];/*content*/
я не думаю, что strtok должен быть использован таким образом …
прочитайте руководство здесь http://php.net/manual/en/function.strtok.php
но я бы использовал что-то вроде этого …
echo substr($href, 0, strpos($href, '#'));
если вы хотите строку раньше #
ты должен использовать explode
. Обойти для вашего подхода может быть что-то вроде этого:
<?php
$href = "#content";
if($href[0]=='#'){//check the first index character
$href="''".$href;
}
$href = strtok($href,'#');
echo $href;
?>