ereg_replace改为preg_replace?

12
如何转换HTML编码为文本
ereg_replace(".*\.(.*)$","\\1",$imgfile);
to
preg_replace... ?

我遇到了些问题,需要解决它?

3个回答

23

将ereg模式转换为preg,需要知道以下4点:

  1. 添加分隔符(/): 'pattern' => '/pattern/'

  2. 如果分隔符是模式的一部分,则转义分隔符: 'patt/ern' => '/patt\/ern/'
    可以通过以下方式以编程方式实现:
    $ereg_pattern = '<div>.+</div>';
    $preg_pattern = '/' .addcslashes($ereg_pattern, '/') . '/';

  3. eregi(不区分大小写匹配): 'pattern' => '/pattern/i' 因此, 如果您使用eregi函数进行不区分大小写匹配,请在新模式('/pattern/')的末尾添加'i'。

  4. ASCII值: 在ereg中,如果您在模式中使用数字,则假定您正在引用字符的ASCII。 但是,在preg中,数字不被视为ASCII值。 因此,如果您的模式包含ereg表达式中的ASCII值(例如:换行符、制表符等),则将其转换为十六进制,并在前面加上\x。
    示例:9(制表符)变成\x9或者使用\t。

希望这能帮助到您。


有一个内置函数可以在定界符之间转义正则表达式字符串 http://php.net/manual/zh/function.preg-quote.php - Brian Leishman

11
preg_replace("/.*\.(.*)$/", "\\1", "foo.jpg")

我不知道为什么PHP需要使用/定界符。Perl、JS等语言使用它们的唯一原因是因为它们允许正则表达式字面量,而PHP不允许。


8
这是因为他们选择使用单个字符串来同时提供修饰符和正则表达式模式。"/[a-z]/i" - kennytm
请参阅 https://www.php.net/manual/en/regexp.reference.delimiters.php。例如,`$a = 'string/with/slashes'; $b = preg_replace('#/with/#', '-without-', $a);是有效的,将$b设置为string-without-slashes,您不必在传递给 preg_replace的正则表达式中转义/`。 - Neek

1

分隔符, 在这种情况下, 按照传统的方式,在表达式的开头和结尾添加任何字符,以及'/'字符 preg_replace('/.*\.(.*)$/',"\\1",$imgfile);。这个正则表达式不是很好,最好使用strrpos并取substr()。

正则表达式比较慢,使用以下代码。 $extension=substr($imgName,strrpos($imgName,'.'));


我知道,但是遇到了这个问题;preg_replace() [function.preg-replace]: Unknown modifier '$' in C:\wamp\www.. - sml
是的,我的错,而且编辑似乎破坏了表达。最好在这种情况下使用substr()。你也可以使用preg_match。 - Jimmy Ruska
你可以使用反引号来转义代码(参见http://stackoverflow.com/editing-help)。$修复看起来不错。 - Matthew Flaschen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接