2010-09-22 2 views
2

Я превратили некоторые eregs в preg_matches путем замены начальной и конечной ^$ с / с (я надеюсь, что было достаточно), но у меня есть ereg_replace в одной и той же функции, что я не уверен.ereg_replace в preg_replace для конкретного регулярного выражения

Это функция checkpostcode, которая находится here.

// Take account of the special BFPO c/o format 
$postcode = ereg_replace ('C\/O', 'c/o ', $postcode); 

Если изменить его preg_replace без изменения регулярных выражений дает эту ошибку: Delimiter must not be alphanumeric or backslash

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

ответ

3

Во-первых, как уже упоминалось в другом месте, вы, вероятно, следует использовать str_replace(), а не регулярное выражение для простых случаев, как в вашем примере.

Теперь, быстрые объяснения о регулярных выражениях в PHP:

Как ясно уже знает, ereg_ * функция теперь осуждается в PHP, и вы должны использовать preg_ * функцию вместо.

Основное различие между двумя наборами функций - это тип регулярного выражения, которое они используют. Функции ereg используют регулярное выражение в стиле POSIX, в то время как функции preg используют регулярное выражение PERL. Разработчики PHP решили стандартизировать регулярное выражение в стиле PERL, поэтому функции ereg устарели.

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

По большей части они на самом деле очень похожи - наиболее распространенные коды регулярных выражений работают одинаково между ними. Например, ^ и $ одинаковы в обоих случаях, обозначая якоря для начала и конца строки.

Там, где они отличаются друг от друга, функции preg не поддерживают многословные классы символов, поддерживаемые ereg.Поэтому, если у вас есть какие-либо eregs, которые включают коды, такие как [:digit:] или [:alpha:], тогда у вас будет больше работы по их преобразованию. Тем не менее, они все еще могут быть преобразованы.

Есть еще несколько отличий между ними, но если вы не выполняете сложные выражения (и это не похоже на это), вы вряд ли столкнетесь с какими-либо другими проблемами, конвертирующими эти два стиля.

Кроме этого, существует большая разница в том, что preg требует символа разделителя на каждом конце строки регулярного выражения, чтобы обозначить, что это регулярное выражение. (обычно это косая черта, но может быть почти любым символом, если на обоих концах он одинаковый). Это не то же самое, что и^и $, поэтому ваше замечание об их замене неверно; вам все равно нужны^и $, а также косые черты.

Поэтому: для преобразования кода Ерег как это: '^xyz$', вы бы просто добавить косую черту, например, так: '/^xyz$/'

Надежда, что помогает.

[править]

Просто быстро редактировать, чтобы дать вам некоторый дополнительный материал:

Оба эти находятся в моих постоянных закладок.

+0

Спасибо за подробный ответ! Есть несколько применений '[: space:]' в регулярных выражениях в функции почтового индекса, которые, по-видимому, я должен преобразовать в '\ s'? – bcmcfc

+0

[: space:] можно преобразовать в ... uh ... пробельный символ. хе-хе. Легко, а? См. Также ссылки ссылки, которые я добавил к моему основному ответу. – Spudley

+0

D'oh! У меня на самом деле была распечатанная (покрытая кофе) распечатка этого листа читов рядом со мной, но без правильного понимания ... это просто обман! ;-) – bcmcfc

4

I've converted some eregs to preg_matches by replacing the initial^and final $ with /s

Вы не должны были заменять их. Вы, вероятно, нужно как:

'/^.....$/' 

Not really having a solid grasp of regex I'm not sure what I need to change C\/O whilst ensuring the pattern still does its job.

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

'#C/O#' 
0
<? 
$postcode = "test C/O"; 
echo ereg_replace ('C\/O', 'c/o ', $postcode); 
//test c/o 
echo preg_replace ('/c\/o/i', 'c/o ', $postcode); 
//test c/o 
?> 

если кто-то может добавить, почему кто-то голосовать вниз, так что я могу узнать из него?

+0

Если кто-то может добавить, почему, кто-то проголосует, так что я могу узнать об этом? –

+0

Я не являюсь нисходящим, ваше решение будет работать (хотя str_replace, вероятно, более эффективен). Я никогда бы никогда не публиковал что-то с 'short_open_tags', может быть, так оно и было. – Wrikken

+0

Две причины: 1. ваша предложенная альтернатива не ведет себя так же, как оригинал, 2. отсутствие намека на «лучшее» решение или любую реальную помощь вообще с проблемой OP. – salathe

3

Если у вас есть фиксированная строка, которая должна быть заменена, почему бы вам не использовать простой str_replace?

$postcode = str_replace('C/O', 'c/o ', $postcode); 
+0

+1 Договорная. в этом конкретном примере str_replace() - это функция для использования; вообще нет необходимости в регулярном выражении. Тем не менее, нам все еще нужно решить вопрос для другого ereg для преобразования preg, он заявил, что он делает, поэтому str_replace() на самом деле является лишь частичным решением. – Spudley

+0

Я не был уверен, что он делает сначала - я не думал об этом и просто предположил, что это какой-то образец, но это не так. Это просто преобразование 'C/O' в' c/o', поэтому да, похоже, что я буду заменять его 'str_replace'. – bcmcfc

Смежные вопросы