ereg заменить на preg заменить для определенного регулярного выражения


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

Это из функции контрольного почтового кода, которую можно найти здесь.

// 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

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

Author: bcmcfc, 2010-09-22

4 answers

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

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

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

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

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

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

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

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

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

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

Надеюсь, это поможет.

[редактировать]

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

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

 4
Author: Spudley, 2010-09-22 14:36:22

Я преобразовал некоторые ereg в preg_matches, заменив начальный ^ и конечный $ на /s

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

'/^.....$/'

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

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

'#C/O#'
 4
Author: Mark Byers, 2010-09-22 11:18:19

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

$postcode = str_replace('C/O', 'c/o ', $postcode);
 3
Author: Gumbo, 2010-09-22 11:49:38
<?
$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
Author: Pramendra Gupta, 2010-09-22 11:46:37