簡體   English   中英

php正則表達式,如果不在HTML標記中,則匹配字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM