#php #string #preg-match
#php #строка #preg-совпадение
Вопрос:
Я просматриваю текст построчно и хочу посмотреть, содержит ли строка фразу «see details» и не чувствительна ли она к регистру, поэтому найду:
Смотрите подробности, Смотрите подробности, СМОТРИТЕ подробности и т. Д
Пока у меня это есть.
if(preg_match("/^(see details)/", strtolower($line)))
{
echo 'SEE DETAILS FOUND';
}
Простой пример был бы полезен, спасибо.
Ответ №1:
Если вы хотите проверить, присутствует ли подстрока в строке, регулярные выражения не нужны: stripos()
отлично подойдет :
if (stripos(strtolower($line), 'see details') !== false) {
// 'see details' is in the $line
}
stripos()
вернет позицию первого вхождения подстроки в строке; или false
если подстрока не найдена.
Это означает, что если она возвращает что-то другое, чем false
, то подстрока найдена.
Комментарии:
1. Благодаря этому имеет больше смысла делать это таким образом. 1-я строка должна быть if (strpos(strtolower($line), ‘see details’) !== false).
2. упс ^^ да, конечно 🙂 извините за это, забыл ввести половину этого… (Я отредактировал свой ответ, чтобы исправить это; спасибо за комментарий!)
3. нет необходимости использовать,
strtolower
когда уже используется сопоставление без учета регистра (stripos
)
Ответ №2:
Ваше регулярное выражение фактически нарушено.
/^(see details)/
Это разбивается на:
- В начале
- Открыть группу захвата
- Найдите один пробел
- За которой следуют все следующие символы:
ee details
- Закрыть группу
s
это escape-последовательность, соответствующая пробелу. Вы могли бы также добавить i
модификатор, чтобы сделать регулярное выражение нечувствительным к регистру. Вы также, похоже, ничего не делаете с захваченной группой, так что вы можете отказаться от этого.
Поэтому:
/^see details/i
это то, что вы хотели бы.
Вы упомянули, что вы просматриваете ввод построчно. Если вам нужно только знать, что весь ввод содержит определенную строку, и у вас есть ввод в виде строки, вы можете использовать m
модификатор, чтобы ^
сопоставить «начало строки» вместо / в дополнение к «началу строки»:
/^see details/im
Если это так, то в итоге вы получите:
if(preg_match('/^see details/im', $whole_input)) {
echo "See Details Found!";
}
Но, как упоминали другие, регулярное выражение здесь не требуется. Вы можете (и должны) выполнить эту работу с помощью более простого stripos
.
Ответ №3:
Как сказал Pascal, вы можете использовать stripos()
функцию, хотя правильный код был бы:
if (stripos(strtolower($line), 'see details') !== false) {
// 'see details' is in the $line
}
Ответ №4:
согласно документации php (http://www.php.net/manual/en/function.preg-match.php ):
<?php
/* The b in the pattern indicates a word boundary, so only the distinct
* word "web" is matched, and not a word partial like "webbing" or "cobweb" */
if (preg_match("/bwebb/i", "PHP is the web scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
if (preg_match("/bwebb/i", "PHP is the website scripting language of choice.")) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>
что выглядит довольно просто и приятно :-).