2016-10-01 124 views
0

如何将每个锚文本替换为所有的锚点。我的代码是preg_replace带锚文本的href锚点

$body='<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'; 

我想要得到的结果是:

<p>The man was dancing like a little boy while all kids were watching ... </p> 

我用:

$body= preg_replace('#<a href="https?://(?:.+\.)?ok.co.*?>.*?</a>#i', '$1', $body); 

和结果是:

<p>The man was while all kids were watching ... </p> 
+0

当应省略号......出现?经过一定的否。的文字或字符? –

+0

正文字符串包含许多锚,我想循环它们全部检查'www.example.com',而不是子域,用它的文本替换每个锚。谢谢 – khalil

+0

@khalil请尝试以下通过我回答。这将解决您的问题。 – Manish

回答

0

试试这个

$body='<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'; 

    echo preg_replace('#<a.*?>([^>]*)</a>#i', '$1', $body); 
+0

感谢这工作取代所有的锚,但对不起,我应该提到,我不想要替换href中的子域,它应该完全匹配如果href包含“www.example.com”,而不是替换任何其他域或子域 – khalil

+0

你能用例子来解释你想看到的吗? – Manish

0

您可以在这里简单地使用strip_tags()htmlspecialchars()

用strip_tags - 地带HTML与字符串PHP标签

用htmlspecialchars - 转换特殊字符为HTML实体

第1步:使用用strip_tags()到去除除<p>标记之外的所有标记。

第2步:因为我们需要与HTML标记一起获得字符串,我们需要使用用htmlspecialchars()

echo htmlspecialchars(strip_tags($body, '<p>')); 

当有已经是一个内置的PHP函数,我认为这是更好和更紧凑的使用而不是使用preg_replace

+0

对不起,我应该提到,我不想要替换href中的子域,它应该完全匹配如果href包含“www.example.com”,而不是替换任何其他域或子域 – khalil

0

可以使用此代码:

正则表达式:/< a.*?>|<a.*?>|<\/a>/g

$body='<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'; 

echo preg_replace('/< a.*?>|<a.*?>|<\/a>/', ' ', $body); 

测试,并显示例如匹配字:https://regex101.com/r/mgYjoB/1

+0

应该没有任何空间一个有效的标签名称,因此' * **' – revo

1

没有正则表达式.....

<?php 

$d = new DOMDocument(); 
$d->loadHTML('<p>The man was <a href="http://www.example.com/video/">dancing like a little boy</a> while all kids were watching ... </p>'); 
$x = new DOMXPath($d); 
foreach($x->query('//a') as $anchor){ 
    $url = $anchor->getAttribute('href'); 
    $domain = parse_url($url,PHP_URL_HOST); 
    if($domain == 'www.example.com'){ 
     $anchor->parentNode->replaceChild(new DOMText($anchor->textContent),$anchor); 
    } 
} 

function get_inner_html($node) { 
    $innerHTML= ''; 
    $children = $node->childNodes; 
    foreach ($children as $child) { 
     $innerHTML .= $child->ownerDocument->saveXML($child); 
    } 
    return $innerHTML; 
} 
echo get_inner_html($x->query('//body')[0]); 
+0

为什么在'$ d-> getElementsByTagName('a')'时使用XPath也是一样的。但是,如果你注册一个函数来检查域名,并且如果你只选择在你的查询中有这个域名的链接节点,XPath可能会很有趣:http://php.net/manual/en/domxpath.registerphpfunctions.php –

+0

你可以当然也可以这样使用,我只需要一个快速的非正则表达式示例,其中'XPath'是我的默认指针。尽管如此,您并不严格需要PHP函数:'// a [starts-with(@ href,'http://www.example.com')]'也可以用于OP,具体取决于预计是否会有类似“https:// www.example.com”或“// www.example.com”的替代方案。 – Wrikken