13

ちょうど 1 つの a 要素を含む html 文字列があります。例:

   <a href="http://www.test.com" rel="nofollow external">test</a>

PHP では、 rel外部が含まれているかどうかをテストし、含まれている場合はhrefを変更して文字列を保存する必要があります。

DOM ノードとオブジェクトを探しました。しかし、HTMLノードを取得するために反復する必要があり、 relが存在し、externalが含まれているかどうかをテストする方法がわからないため、A要素が1つだけでは多すぎるようです。

$html = new DOMDocument();
$html->loadHtml($txt);
$a = $html->getElementsByTagName('a');
$attr = $a->item(0)->attributes();
...

この時点で、オーバーヘッドと思われる NodeMapList を取得します。これにはもっと簡単な方法がありますか、それともDOMで行うべきですか?

4

4 に答える 4

2

私はDOMで変更し続けました。これは私が得るものです:

$html = new DOMDocument();
$html->loadHtml('<?xml encoding="utf-8" ?>' . $txt);
$nodes = $html->getElementsByTagName('a');
foreach ($nodes as $node) {
    foreach ($node->attributes as $att) {
        if ($att->name == 'rel') {
            if (strpos($att->value, 'external')) {
                $node->setAttribute('href','modified_url_goes_here');
            }
        }
    }
}
$txt = $html->saveHTML();

この 1 つの文字列だけのために他のライブラリをロードしたくありませんでした。

于 2013-04-21T02:24:04.390 に答える
1

最善の方法は HTML パーサー/DOM を使用することですが、正規表現のソリューションは次のとおりです。

$html = '<a href="http://www.test.com" rel="nofollow external">test</a><br>
<p> Some text</p>
<a href="http://test.com">test2</a><br>
<a rel="external">test3</a> <-- This won\'t work since there is no href in it.
';

$new = preg_replace_callback('/<a.+?rel\s*=\s*"([^"]*)"[^>]*>/i', function($m){
    if(strpos($m[1], 'external') !== false){
        $m[0] = preg_replace('/href\s*=\s*(("[^"]*")|(\'[^\']*\'))/i', 'href="http://example.com"', $m[0]);
    }
    return $m[0];
}, $html);

echo $new;

オンラインデモ

于 2013-04-21T02:25:02.173 に答える
0

You could use a regular expression like if it matches /\s+rel\s*=\s*".*external.*"/ then do a regExp replace like /(<a.*href\s*=\s*")([^"]\)("[^>]*>)/\1[your new href here]\3/

Though using a library that can do this kind of stuff for you is much easier (like jquery for javascript)

于 2013-04-21T01:49:23.507 に答える