1

一部のテキストを解析して、タグに target="_blank".... が含まれるすべてのインスタンスを見つけられるようにする必要があります。一致ごとに、次のように追加します (例: このリンクは終了タグの前に新しいウィンドウで開きます)。

例えば:

前:

<a href="http://any-website-on-the-internet-or-local-path" target="_blank">Go here now</a>

後:

<a href="http://any-website-on-the-internet-or-local-path" target="_blank">Go here now<span>(This link opens in a new window)</span></a>

これはPHPサイト用なので、preg_replace()がメソッドになると思います...正規表現を適切に書くスキルがありません。

誰でも提供できるヘルプを事前に感謝します。

4

5 に答える 5

8

非常に明確に定義され、管理されている場合を除いて、HTML の解析に正規表現を使用しないでください。

代わりに、組み込みのパーサーを試してください。

$dom = new DOMDocument();
$dom->loadHTML($your_html_source);
$xpath = new DOMXPath($dom);
$links = $xpath->query("//a[@target='_blank']");
foreach($links as $link) {
    $link->appendChild($dom->createTextNode(" (This link opens in a new window)"));
}
$output = $dom->saveHTML();

または、これがブラウザに出力されている場合は、CSS を使用できます。

a[target='_blank']:after {
    content: ' (This link opens in a new window)';
}
于 2013-04-23T18:52:17.940 に答える
1

これは、アンカータグの置換で機能します....

$string = str_replace('<a ','<a target="_blank" ',$string);
于 2014-02-25T04:30:04.687 に答える
0

まあ@Kolinkは正しいですが、私のRegExpバージョンがあります。

$string = '<p>mess</p><a href="http://google.com.br/" target="blank" class=\"bother\">Google</a><p>mess</p>';
echo preg_replace("/(\<a.*?target=\"blank\".*?>)(.*?)(\<\/a\>)/miU","$1$2(This link opens in a new window)$3",$string);
于 2013-04-23T19:07:02.957 に答える
-1

これは仕事をします:

$newText = '<span>(This link opens in a new window)</span>';
$pattern = '~<a\s[^>]*?\btarget\s*=(?:\s*([\'"])_blank\1|_blank\b)[^>]*>[^<]*(?:<(?!/a>)[^<]*)*\K~i';
echo preg_replace($pattern, $newText, $html);

ただし、この直接文字列アプローチは、コメント付きの html 部分、文字列、または css または JavaScript コード内のコメント、最終的には JavaScript リテラル正規表現内のコメントも置き換える可能性があります。そのため、これらの落とし穴を回避したい場合は、DOM アプローチを使用する必要があります。あなたがしなければならないのは、目的の属性を持つ各リンクに新しいノードを追加することだけです:

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$xp = new DOMXPath($dom);
$nodeList = $xp->query('//a[@target="_blank"]');

foreach($nodeList as $node) {
    $newNode = dom->createElement('span', '(This link opens in a new window)');
    $node->appendChild($newNode);
}

$html = $dom->saveHTML();

最後に、最後の選択肢は、html をまったく変更せず、css で遊ぶことです。

a[target="_blank"]::after {
    content: " (This link opens in a new window)";
    font-style: italic;
    color: red;
}
于 2013-04-23T20:08:49.560 に答える
-2

無限に長い文字列を評価する正規表現を書くことはできません。私は提案します:

$h = explode('>', $html);

これにより、他の配列と同じようにトラバースしてから実行する機会が得られます。

foreach($h as $k){
    if(!preg_match('/^<a href=/', $k){
        continue;
        }elseif(!preg_match(/target="_blank")/, $k){
        continue;
        }else{
        $h[$k + 1] .= '(open in new window);
        }
    }
$html = implode('>', $h);

これは、私がそのような問題にアプローチする方法です。もちろん、私はこれを頭の上から放り投げただけで、そのまま動作することが保証されていますが、正確なロジックにいくつかの微調整を加えれば、必要なものが手に入ります。

于 2013-04-23T18:59:56.650 に答える