0

fn:contains を使用して DOMDocument オブジェクトを検索し、単語が完全に一致する場合にのみ true を返すことは可能ですか?

キーワードの内部リンク置換を行う、自分で書いていないテキスト置換スニペットがあります。しかし、書かれているように、完全な単語だけでなく、部分的な単語も置き換えます。

スニペットは次のとおりです。

$autolinks = $this->config->get('autolinks');
if (isset($autolinks) && (strpos($this->data['description'], 'iframe') == false) 
        && (strpos($this->data['description'], 'object') == false)):
    $xdescription = mb_convert_encoding(html_entity_decode($this->data['description'], ENT_COMPAT, "UTF-8"), 'HTML-ENTITIES', "UTF-8"); 
    libxml_use_internal_errors(true);
    $dom = new DOMDocument;             
    $dom->loadHTML('<div>'.$xdescription.'</div>');             
    libxml_use_internal_errors(false);
    $xpath = new DOMXPath($dom);
    foreach ($autolinks as $autolink):
        $keyword    = $autolink['keyword'];
        $xlink  = mb_convert_encoding(html_entity_decode($autolink['link'], ENT_COMPAT, "UTF-8"), 'HTML-ENTITIES', "UTF-8");
        $target     = $autolink['target'];
        $tooltip    = isset($autolink['tooltip']);                          
        $pTexts     = $xpath->query(
            sprintf('///text()[contains(., "%s")]', $keyword)
        );
        foreach ($pTexts as $pText):
            $this->parseText($pText, $keyword, $dom, $xlink, $target, $tooltip);
        endforeach;
    endforeach;
    $this->data['description'] = $dom->saveXML($dom->documentElement);
endif;

例:

私のキーワードが「マッサージ」の場合 *マッサージ*r は部分的に一致し、リンクに変換されますが、単語全体のみが変換され、マッサージャーではありません。

4

4 に答える 4

1

XSLT 1.0 でのテキスト操作は非常に制限されていますが、2.0 に移行できない場合 (なぜ移行しないのですか?) は、translate()しばしば助けになります。translate()すべての一般的な句読点文字をスペースで置き換え、concat()前後にスペースを追加してからcontains(' massage ')(スペースに注意してください)をテストするために使用します。

于 2013-09-11T09:04:51.213 に答える
0

これは実際には信じられないほど単純であることが判明しました$keyword。変数の末尾にスペースを追加しただけなので、単語全体が見つかった場合にのみ true を返します。

foreach ($autolinks as $autolink):
    $keyword    = trim($autolink['keyword']) . ' ';
    $xlink      = mb_convert_encoding(html_entity_decode($autolink['link'], ENT_COMPAT, "UTF-8"), 'HTML-ENTITIES', "UTF-8");
    $target     = $autolink['target'];
    $tooltip    = isset($autolink['tooltip']);                          
    $pTexts     = $xpath->query(
        sprintf('///text()[contains(., "%s")]', $keyword)
    );
    foreach ($pTexts as $pText):
        $this->parseText($pText, $keyword, $dom, $xlink, $target, $tooltip);
    endforeach;
endforeach;

助けようとしたすべての人に感謝します。

于 2013-09-11T10:15:55.147 に答える