PHP使用preg_replace

时间:2018-07-12 19:56:59

标签: php regex preg-replace

如何在PHP中使用preg_replace来使用正则表达式更改href标记中域的多次出现。

我只需要链接的相对路径。我拥有的代码删除了所有内容,包括网址路径和查询参数。

当前链接的出现

<a href="https://www.website.com/LUGAD-Clothing-Jewelry-Shoulder-Brushed/dp/B07D1V99MF/ref=sr_1_3/131-4937141-2376367/s=apparel&ie=UTF8&qid=1531422091&sr=1-3&nodeID=7141123011&psd=1&keywords=clothing%2Cshoes+and+jewelry">The Link</a>

所需链接出现

<a href="/LUGAD-Clothing-Jewelry-Shoulder-Brushed/dp/B07D1V99MF/ref=sr_1_3/131-4937141-2376367/s=apparel&ie=UTF8&qid=1531422091&sr=1-3&nodeID=7141123011&psd=1&keywords=clothing%2Cshoes+and+jewelry">The Link</a>

我已经尝试过了

$html = $this->curl->getContent($completeUrl);

$newhtml = preg_replace('/<a(.*)href="([^"]*)"(.*)>/','<a$1href="/"$3>',$html);

摘要。 我很想使用正则表达式将所有出现的绝对href转换为相对href

1 个答案:

答案 0 :(得分:1)

根据您的疑问,您应该使用这样的正则表达式:

(<a\s+href\s*=\s*")(?:https?:\/\/)?www\.website\.com\/

Demo

preg_replace('/(<a\s+href\s*=\s*")(?:https?:\/\/)?www\.website\.com\//i', '$1', $str);

这基于您的想法,即使用a-href作为替换的锚点。 我们不能真正在URL之前使用后向断言来断言a-href,因为可以有任意空格,并且PCRE不支持后向变长模式。
因此,我捕获了前面,并使用$1将其放回了替换中。

如果您必须在href之前处理其他属性,可以使用:

(<a(?:(?!href).)* href\s*=\s*")(?:https?:\/\/)?www\.website\.com\/

Demo 2