4

我正在将我找到的 eregi_replace 函数转换为 preg_replace,但是 eregi 字符串中包含键盘上的每个字符。所以我尝试使用 £ 作为分隔符.. 它目前正在工作,但我想知道它是否可能会因为它是非标准字符而导致问题?

这是ereg:

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;}

和怀孕:

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;
}
4

5 回答 5

4

您可以使用括号来分隔正则表达式而不是单个字符,例如:

preg_replace('(abc/def#ghi)i', ...);

这可能比试图找到一个(还)不是你表达的一部分的不起眼的角色更好。

于 2011-03-05T23:34:53.240 回答
4

£是有问题的,因为它不是 ASCII 字符。它来自 Latin-1 字符集,并且仅当您的 PHP 脚本也使用 8 位表示时才有效。如果您的文件被编码为 UTF-8,那么£将表示为两个字节。而 PHP 中的 PCRE 会绊倒它。(至少我的版本可以。)

于 2011-03-06T00:11:03.890 回答
2

您可以使用 unicode 字符,只是为了确定。

\u00A3

注意 ereg 函数和 unicode 支持。

http://www.regular-expressions.info/php.html
http://www.regular-expressions.info/characters.html

女王万岁。

于 2011-03-05T23:36:16.477 回答
2

正如@Chris 指出的那样,您可以使用成对的括号字符作为分隔符,但它们必须在整个正则表达式中正确平衡。例如,'<<>'不会工作,但'<<>>'会。您可以使用 、 或 中的任何一个 (),但[]我建议使用大括号或方括号;括号在正则表达式中太常见了,尖括号用于转义序列,如(原子组)和(lookbehind)。{}<>(?>...)(?<=...)

但我和@Brad 一起讨论这个问题:为什么不在正则表达式中出现时用反斜杠转义分隔符?

于 2011-03-06T00:58:11.040 回答
1

你会比我们更了解正在解析的数据。就正则表达式而言,它与任何其他 ASCII 值没有什么不同。

尽管我不得不问:传统然后逃避它有什么问题?还是使用具有字符范围的类?

于 2011-03-05T23:33:18.527 回答