Простой RegEx PHP - PullRequest
       35

Простой RegEx PHP

1 голос
/ 17 июня 2009

У меня есть строка, и мне нужно посмотреть, содержит ли она следующее "_archived".

Я использовал следующее:

preg_match('(.*)_archived$',$string);

но получите:

Warning: preg_match() [function.preg-match]: Unknown modifier '_' in /home/storrec/classes/class.main.php on line 70

Я новичок в регулярных выражениях, так что это, вероятно, очень просто.

Или я должен использовать что-то более простое, например

strstr($string, "_archived");

Заранее спасибо

Ответы [ 9 ]

7 голосов
/ 17 июня 2009

strstr ($ string, "_archived");

Будет намного проще для проблемы, которую вы описываете.

Как часто цитируется

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы. - Джейми Завински

6 голосов
/ 17 июня 2009

strstr в этом случае достаточно, но чтобы решить вашу проблему, вам нужно добавить разделители к вашему регулярному выражению. Разделитель - это специальный символ, который начинает и заканчивает регулярное выражение, например:

preg_match('/_archived/',$string);

В качестве разделителя может быть много разных символов, но обычные варианты: /, # и!. Из руководства по PHP:

Любой символ может использоваться для разделителя, если он не является буквенно-цифровым, обратным слешем () или нулевым байтом. Если в самом выражении должен использоваться символ-разделитель, он должен быть экранирован обратной косой чертой. Начиная с PHP 4.0.4, вы также можете использовать Perl-style (), {}, [] и <> соответствующие разделители.

Подробнее о синтаксисе регулярных выражений PHP здесь .

Вы можете увидеть некоторые примеры допустимых (и недействительных) шаблонов в руководстве PHP здесь .

1 голос
/ 17 июня 2009

Если все, что вам нужно, это если строка содержит строку, то во всех случаях используйте простую версию. Но вы также можете просто сделать:

preg_match('/_archived/', $string);
1 голос
/ 17 июня 2009

Вам просто нужны некоторые разделители, например, заключить шаблон в /

preg_match('/_archived$/',$string);

Регулярные выражения Perl позволяют вам использовать любой разделитель, что удобно, если ваше регулярное выражение использует / много. Я часто использую фигурные скобки, например:

preg_match('{_archived$}',$string);

Также обратите внимание, что вам не нужен бит (. *), Так как вы не захватываете бит перед "_archived", вы просто проверяете, заканчивается ли строка этим (этот символ $ на конец соответствует концу строки)

0 голосов
/ 11 декабря 2018

Вам не нужно помнить о разделителях, если вы используете T-Regx

pattern('_archived$')->matches($string)
0 голосов
/ 17 июня 2009

Когда у вас есть конкретная строка, которую вы ищете, используйте регулярные выражения с небольшим перерасходом. Вы будете в порядке, используя одну из стандартных функций поиска строк PHP здесь.

Функция strstr будет работать, но обычный PHP Wisdom (читай: миф, легенда, суеверие, руководство ) говорит, что использование функции strpos даст лучшую производительность. то есть что-то вроде

if(strpos($string, '_archived') !== false) {
}

Здесь вы захотите использовать оператор истинного неравенства, так как strpos возвращает «0», когда находит иглу в начале своего стога сена. См. руководство для получения дополнительной информации по этому вопросу.

Что касается вашей проблемы, механизм регулярных выражений PHP ожидает, что вы заключите строку регулярного выражения в набор разделителей, который может быть одним из нескольких различных символов ("/" или "|" или "(" или ") {"или" # ", или ...). Механизм PHP считает, что вам нужно регулярное выражение

.*

с набором модификаторов шаблона, которые

_archived$

Итак, в будущем, когда вы будете использовать регулярное выражение, попробуйте что-то вроде

//equivilant
preg_match('/(.*)_archived$/i',$string);
preg_match('{(.*)_archived$}i',$string);
preg_match('#(.*)_archived$#i',$string);

Символы "/", "#" и "{}" являются вашими разделителями. Они не используются в матче, они используются для того, чтобы сказать движку «что-нибудь между этими символами - мой рег. но я включил его здесь, чтобы вы могли видеть, как выглядит модификатор шаблона, и чтобы помочь вам понять, зачем вам в первую очередь разделители.

0 голосов
/ 17 июня 2009

... вероятно, лучший способ реализовать это. Вы правы, что регулярное выражение излишне.

0 голосов
/ 17 июня 2009

strstr () или strpos () было бы лучше найти что-то подобное, я думаю. Ошибка, которую вы получаете из-за отсутствия разделителей вокруг вашего регулярного выражения. Попробуйте использовать

"/(.*)_archived$/"

или

"#(.*)_archived$#".
0 голосов
/ 17 июня 2009

Попробуйте:

preg_match('/(.*)_archived$/',$string);

Если вы проверяете, существует ли только строка в $ string, вам может хватить strstr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...