我正在尝试在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标记内的任何以#为前缀的单词(因此先于&lt;然后是&gt;)。
我知道如何实现这一目标?
答案 0 :(得分:1)
您是否可以先删除标签,因为匹配(使用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标记内不的主题标签,那么正则表达式将会非常棘手。
答案 1 :(得分:0)
您可以使用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;
}
答案 2 :(得分:0)
我使用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);
}