我坚持使用简单的正则表达式来匹配内容中的网址。目标是从“/ 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>
答案 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";