Можно ли использовать £ в качестве разделителя в 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.

Хотя я должен спросить: что не так с традиционным, тогда просто избежать его? Или используя класс с диапазоном символов?

Другие вопросы по тегам