除了具有远程链接的锚之外,我怎么能strip_tags?

时间:2014-05-06 21:42:13

标签: php replace preg-replace str-replace strip-tags

如何用标签链接替换标签内容

$str = 'This <strong>string</strong> contains a <a href="/local/link.html">local link</a>
        and a <a href="http://remo.te/link.com">remote link</a>';
$str = strip_tags($str,'<a>'); // strip out the <strong> tag
$str = ?????? // how can I strip out the local link anchor tag, but leave the remote link?
echo $str;

期望的输出:

This string contains a local link and a <a href="http://remo.te/link.com">remote link</a>

或者,更好,将远程链接的内容替换为其网址:

This string contains a local link and a http://remo.te/link.com

如何实现最终输出?

7 个答案:

答案 0 :(得分:6)

替换您的remotely linked anchor with the URL

<a href="(https?://[^"]+)">.*?</a>
$1

删除anchor around a local URL

<a href="(?!https?://)[^"]+">(.*?)</a>
$1

<强>解释

这两个表达式字面上匹配<a href=""></a>。然后,第一个网址将匹配我们可以引用{{} {1}}。第二个表达式将匹配任何不以先前使用的协议开头的内容,然后将链接的实际文本捕获到http

请注意,正则表达式不是解析HTML的最佳解决方案,因为HTML is not a regular language。但是,您的用例似乎很“简单”,我们可以制作正则表达式。此 不会 使用s://等链接,但可以展开以允许这些用例(因此我之前的说明) HTML不规则)。


<强> PHP

"

答案 1 :(得分:2)

  

注意: HTML不是常规语言,无法使用正则表达式进行解析。改为使用DOM解析器。

但是,如果您完全确定格式,则可以使用正则表达式。整个任务只需分为两个步骤:

/* Replace relative URIs with their anchor text */
$str = preg_replace('#<a[^>]*href="(?=/)[^"]+">([^<]+)</a>#', '$1', $str); 

/* Replace absolute URIs with their href */
$str = preg_replace('#<a[^>]*href="((?!/)[^"]+)">[^<]+</a>#', '$1', $str);

当然,如果其中一个属性值包含>,则会失败。如果您关心那些极端情况,使用DOM解析器将是正确的解决方案。

输出:

This string contains a local link
        and a http://remo.te/link.com

Demo

答案 2 :(得分:1)

这可以通过使用类DOMDocument

来实现

X:

$doc = new DOMDocument('1.0', 'UTF-8');         
$doc->loadHTML($str);

并进一步处理该方法的链接:

$doc->getElementsByTagName('a')

答案 3 :(得分:1)

以下是我如何解决它:

$str = 'This <strong>string</strong> contains a <a href="/local/link.html">local link</a> and a <a href="http://remo.te/link.com">remote link</a>';
$str = preg_replace('/<a [^>]*?href="(http:\/\/[A-Za-z0-9\\.:\/]+?)">([\\s\\S]*?)<\/a>/','\\1', $str); // strip remote links and replace with href
$str = strip_tags($str); // strip any local links
echo $str;

结果:

This string contains a local link and a http://remo.te/link.com

答案 4 :(得分:0)

如果此字符串未动态创建,而您了解数据href,则可以尝试

$str = 'This <strong>string</strong> contains a <a href="/local/link.html">local link</a>
        and a <a href="http://remo.te/link.com">remote link</a>';
$str = str_replace(array('<a href="/local/link.html">', '</a>'), ' ' , $str);       
$str = strip_tags($str,'<a>'); // strip out the <strong> tag
echo $str;

结果:

This string contains a  local link and a <a href="http://remo.te/link.com">remote link</a>

答案 5 :(得分:0)

简单的html dom可能是你最好的选择:

$doc = str_get_html($html);

foreach($doc->find('a') as $a){
  $a->outertext = preg_match('/^http/', $a->href) ? $a->href : $a->text();
}

echo $doc;

答案 6 :(得分:0)

在我的情况下,我需要一些东西来替换锚标记,但保留锚标记的链接内部文本。因此,我修改了@Sam 的解决方案,并为内部文本添加了一个额外的匹配组。

$text = strip_tags($html,'<a>');
$text = preg_replace('~<a href="(https?://[^"]+)".*?>(.*?)</a>~', '$2 ($1)', $text);

对于 <a href="https://stackoverflow.com">Stackoverflow<a>,上面的代码将输出 Stackoverflow (https://stackoverflow.com)