2011-05-21 76 views
0

我对正则表达式有一个非常基本的问题。我想匹配,更换网址,像这样的:简单正则表达式中同一行上有多个匹配的问题

http://mydomain.com/image/13/imagetitle.html 

对于我用下面的表达式:

/mydomain.com(.*)image\/(\d+)\/(.*).html/ 

这种模式工作正常居多,但它并不时出现多次出现在工作同一条线。所以这个工程:

This is my own image: http://mydomain.com/image/13/imagetitle.html 

当包括跨线多次出现它的工作原理,以及:

This is my own image: http://mydomain.com/image/13/imagetitle.html 
Yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html 

两次出现匹配,并且正确地更换。然而,这只是取代了第一场比赛的时候有两次出现在同一行:

This is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html 

我怎样才能确保所有比赛被替换,无论新线?

+1

你可以粘贴你用来做替换的代码吗? – VladFr 2011-05-21 12:19:18

+0

实际上,从preg_replace()函数的角度来看,<不是换行符。这两个例子都被视为单行主题。如果你显示你的替换代码,它会更清晰。 – Kel 2011-05-21 12:35:33

+0

@凯尔:我很确定实际文本在那个地方有一个换行符,但是操作系统把它改成了'
',因为他错误地认为换行符在发布问题时会被规范化到一个空间。正如你指出的那样,如果真的有'
'那里,他不会有这个问题。 – 2011-05-21 19:03:43

回答

2

我也没有得到任何问题。但从正则表达式来看,你的问题很可能是贪婪。

(.*)尽可能匹配。如果它们位于同一行,它将一次捕获两个URL。因此,您通常希望使用(.*?),或应用标准/U

但在你的情况我建议干脆让比赛更加具体:

/mydomain.com(\S*)image\/(\d+)\/(\S*).html/ 

这里\S将只匹配任何不是空格,因为这是最肯定是其中的URL应该被打破了。作为替代方案,您可以使用更具体的字符类,如([\w/.?&#%=-]*)而不是.*?

+0

谢谢,完美的作品!这确实是一个贪婪问题,我完全按照你的建议使用了“特定匹配”完整规则。 – Ferdy 2011-05-21 13:08:50

0

您的模式正在工作。我已经通过foll代码对其进行了测试:

$data = "This1 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html 
This2 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html 
This3 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html 
This4 is my own image: http://mydomain.com/image/13/imagetitle.html, yet I recommend this one as well: image: http://mydomain.com/image/15/imagetitle2.html 
"; 
echo preg_replace('/mydomain.com(.*)image\/(\d+)\/(.*).html/', 'replaced one', $data);