替换本地链接,保留外部链接

时间:2009-04-09 12:44:30

标签: php regex parsing negative-lookahead

我有一个API调用,它本质上返回托管的wiki应用程序页面的HTML。我正在做一些substr,str_replace和preg_replace kung-fu,根据我的网站样式指南进行格式化。

我做了一组调用来格式化我的左侧导航(将pageX的链接更改为我的wikiParse?page = pageX类型的东西)。我可以在左侧导航栏上安全地执行此操作。但是,在正文中,我无法安全地假设链接是指向内部页面的链接。它很可能是外部资源的链接。所以我需要做一个与href =匹配的preg_replace,后面没有http://。

这是我的抨击:

$result = preg_replace('href\=\"(?!http\:\/\/)','href="bla?id=',$result);

这似乎剥离了页面上的全部内容。有谁看到我滑倒的地方?我不认为我太远了,只是看不到下一步去哪里。

干杯

2 个答案:

答案 0 :(得分:1)

preg_* functions期待Perl-Compatible Regular Expressions (PCRE)。与正常正则表达式的结构差异在于表达式本身被包装到分隔符中,该分隔符将表达式与可能的modifiers分开。经典分隔符是/,但PHP允许除反斜杠字符之外的任何其他非字母数字字符。另请参阅Intruduction to PCRE in PHP

所以试试这个:

$result = preg_replace('/href="(?!http:\/\/)/', 'href="bla?id=', $result);

此处href="(?!http://)是正则表达式。但是,当我们使用/作为分隔符时,必须使用反斜杠转义正则表达式中/的出现。

答案 1 :(得分:1)

你的正则表达式缺少开始和结束分隔符(默认情况下为'/');

$result = preg_replace('/href\=\"(?!http\:\/\/)/','href="bla?id=',$result);