php正则表达式匹配字符串,如果不在HTML标记中

时间:2012-08-08 02:29:31

标签: php regex drupal drupal-modules

我正在尝试在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;)。

我知道如何实现这一目标?

3 个答案:

答案 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);
}