Можно ли использовать £ в качестве разделителя в preg_replace?
Я конвертирую найденную мной функцию eregi_replace в preg_replace, но в строке eregi есть все символы клавиатуры. Поэтому я попытался использовать £ в качестве разделителя... и он работает в настоящее время, но мне интересно, может ли это вызвать проблемы, потому что это нестандартный символ?
Вот эреги:
function makeLinks($text) {
$text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
'<a href="\\1">\\1</a>', $text);
$text = eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
'\\1<a href="http://\\2">\\2</a>', $text);
return $text;}
и preg:
function makeLinks($text) {
$text = preg_replace('£(((f|ht){1}tp://)[-a-zA-^Z0-9@:%_\+.~#?&//=]+)£i',
'<a href="\\1">\\1</a>', $text);
$text = preg_replace('£([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)£i',
'\\1<a href="http://\\2">\\2</a>', $text);
return $text;
}
5 ответов
£
проблематично, потому что это не символ ASCII. Он из кодировки Latin-1 и будет работать, только если ваш PHP-скрипт также использует 8-битное представление. Если ваш файл закодирован как UTF-8, то £
будет представлен в виде двух байтов. И PCRE в PHP отключится. (По крайней мере, моя версия делает.)
Вы можете использовать скобки для разделения регулярных выражений, а не одного символа, например:
preg_replace('(abc/def#ghi)i', ...);
Это, вероятно, было бы лучше, чем пытаться найти неясного персонажа, который (пока) не является частью вашего выражения.
Как указывал @Chris, вы можете использовать парные скобки в качестве разделителей, но они должны быть правильно сбалансированы по всему регулярному выражению. Например, '<<>'
не сработает, но '<<>>'
будут. Вы можете использовать любой из ()
, []
, {}
или же <>
, но я рекомендую скобки или квадратные скобки; круглые скобки слишком часто встречаются в регулярных выражениях, а угловые скобки используются в escape-последовательностях, таких как (?>...)
(атомная группа) и (?<=...)
(смотреть за).
Но я с @Brad на этот раз: почему бы просто не экранировать символ-разделитель с обратной косой чертой всякий раз, когда он появляется в регулярном выражении?
Вы можете использовать символ Unicode, просто чтобы быть уверенным.
\u00A3
Следите за функциями ereg и поддержкой юникода.
http://www.regular-expressions.info/php.html
http://www.regular-expressions.info/characters.html
Да здравствует королева.
Вы бы знали, что данные анализируются лучше, чем мы. Что касается регулярных выражений, то оно ничем не отличается от любого другого значения ASCII.
Хотя я должен спросить: что не так с традиционным, тогда просто избежать его? Или используя класс с диапазоном символов?