正则表达式:否定主张

时间:2012-08-13 12:59:15

标签: php regex

我坚持使用简单的正则表达式来匹配内容中的网址。目标是从“/ folder / id / 123”这样的链接中删除文件夹,并将其替换为“id / 123”,这样它就是同一文件夹中的短文件。

其实我做过

$pattern = "/\/?(\w+)\/id\/(\d)/i"
$replacement = "id/$2";
return preg_replace($pattern, $replacement, $text);

似乎工作正常。

然而,我想要的最后一个测试是测试匹配的每个url不包含http://,如果它是一个外部站点也使用相同的模式/folder/id/123.

我尝试了/ [^ http://]或(?<!html)...并且不同的事情没有成功。任何帮助都会很好: - )

    $pattern = "/(?<!http)\b\/?(\w+)\/id\/(\d)/i"; ???????

谢谢!

以下是一些例子:非常感谢您的帮助: - )

(these should be replaced, "same folder" => short relative path only)
<a href="/mysite_admin/id/414">label</a> ==> <a href="id/414">label</a>
<a href="/mYsITe_ADMIN/iD/29">label with UPPERCASE</a> ==> <a href="id/414">label with UPPERCASE</a>

(these should not be replaced, when there is http:// => external site, nothing to to)
<a href="http://mysite_admin/id/414">label</a> ==> <a href="http://mysite_admin/id/414">label</a>
<a href="http://www.google_admin.com">label</a> ==> <a href="http://www.google_admin.com">label</a>
<a href="http://anotherwebsite.com/id/32131">label</a> ==> <a href="http://anotherwebsite.com/id/32131">labelid/32131</a>
<a href="http://anotherwebsite_admin.com/id/32131">label</a> ==> <a href="http://anotherwebsite_admin.com/id/32131">label</a>

2 个答案:

答案 0 :(得分:2)

不需要<,用于标记look-back断言,只需使用/^(?!http)\/?(\w+)\/node\/(\d)/i作为模式,它匹配/ foo / bar / 123,但不匹配{{ 3}}

http://www.google.com/foo/bar/123提供了一个很好的概述,可以帮助您解决此问题

答案 1 :(得分:0)

从精美的PHP手册 - Assertions

  

请注意,明显相似的模式(?!foo)栏找不到   发生&#34; bar&#34;除了&#34; foo&#34;之外的其他东西;它   发现任何&#34; bar&#34;无论如何,因为断言   当接下来的三个字符为&#34; bar&#34;时,(?!foo)始终为TRUE。一个   为了达到这个效果,需要使用lookbehind断言。

如:

$pattern = "/(?<!http:\/)\/(\w+)\/id\/(\d)/i";