[英]php regular expression to match string if NOT in an HTML tag
我正在尝试解决Drupal的Hashtags模块中的此错误: http ://drupal.org/node/1718154
我有此功能,可匹配文本中以“#”为前缀的每个单词,例如#tag:
function hashtags_get_tags($text) {
$tags_list = array();
$pattern = "/#[0-9A-Za-z_]+/";
preg_match_all($pattern, $text, $tags_list);
$result = implode(',', $tags_list[0]);
return $result;
}
我需要忽略页面中的内部链接,例如<a href="#reference">link</a>
,或者更一般而言, 忽略 HTML标记中出现的带有#前缀的任何单词(因此以<和开头通过>)。
知道我该如何实现吗?
是否可以因为匹配而首先剥离标签(使用strip_tags函数)?
function hashtags_get_tags($text) {
$text = strip_tags($text);
$tags_list = array();
$pattern = "/#[0-9A-Za-z_]+/";
preg_match_all($pattern, $text, $tags_list);
$result = implode(',', $tags_list[0]);
return $result;
}
如果您只想匹配不在 HTML标记内的主题标记,则正则表达式将非常棘手。
您可以使用preg_replace事先丢弃标签
function hashtags_get_tags($text) {
$tags_list = array();
$pattern = "/#[0-9A-Za-z_]+/";
$text=preg_replace("/<[^>]*>/","",$text);
preg_match_all($pattern, $text, $tags_list);
$result = implode(',', $tags_list[0]);
return $result;
}
我使用PHP DOM进行了此功能。
它返回所有在href
中带有#
链接。
如果希望它仅删除内部哈希标签,请替换此行:
if(strpos($link->getAttribute('href'), '#') === false) {
有了这个:
if(strpos($link->getAttribute('href'), '#') !== 0) {
这是功能:
function no_hashtags($text) {
$doc = new DOMDocument();
$doc->loadHTML($text);
$links = $doc->getElementsByTagName('a');
$nohashes = array();
foreach($links as $link) {
if(strpos($link->getAttribute('href'), '#') === false) {
$temp = new DOMDocument();
$elem = $temp->importNode($link->cloneNode(true), true);
$temp->appendChild($elem);
$nohashes[] = $temp->saveHTML();
}
}
// return $nohashes;
return implode('', $nohashes);
// return implode(',', $nohashes);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.