2

httpリンクを見つけてハイパーリンクに置き換える必要があります。これらのhttpリンクはスパンタグ内にあります。

$textにはhtmlページがあります。スパンタグの1つに次のようなものがあります

<span class="styleonetwo" >http://www.cnn.com/live-event</span>

これが私のコードです:

$doc = new DOMDocument();
$doc->loadHTML($text);
foreach($doc->getElementsByTagName('span') as $anchor) {
    $link = $anchor->nodeValue;
    if(substr($link, 0, 4) == "http")
    {
        $link = "<a href=\"$link\">$link</a>";
    }
    if(substr($link, 0, 3) == "www")
    {
        $link = "<a href=\"http://$link\">$link</a>";
    }    
    $anchor->nodeValue = $link;
}
echo $doc->saveHTML();

それは大丈夫です。ただし...スパン内のデータが次のようなものであっても、これを機能させたいです。

<span class="styleonetwo" > sometexthere http://www.cnn.com/live-event somemoretexthere</span>

明らかに、上記のコードはこの状況では機能しません。preg_replaceを使用せずにDOMDocumentを使用してパターンを検索および置換する方法はありますか?

更新: preg_replaceに関するphilの質問に答えるには:

regexpal.comを使用して、次のパターンマッチングをテストしました。

\b(?:(?:https?|ftp|file)://|(www|ftp)\.)[-A-Z0-9+&@#/%?=~_|$!:,.;]*[-A-Z0-9+&@#/%=~_|$]

regexpalで提供されるregextesterでうまく機能します。PHPコードで同じパターンを使用すると、大量の奇妙なエラーが発生しました。エスケープ文字でも不明な修飾子エラーが発生しました!以下はpreg_replaceの私のコードです

$httpRegex = '/\b(\?:(\?:https?|ftp|file):\/\/|(www|ftp)\.)[-A-Z0-9+&@#/%\?=~_|$!:,.;]*[-A-Z0-9+&@#/%=~_|$]/';
$cleanText = preg_replace($httpRegex, "<a href='$0'>$0</a>", $text);

私は「未知の修飾子」にとても不満を感じ、問題を解決するためにDOMDocumentを追求しました。

4

1 に答える 1

2

正規表現はこの問題に適していますpreg_replace

パターンにエスケープされていない区切り文字がいくつかあるので、それらをエスケープするか、別の文字を区切り文字として選択します^。したがって、正しいパターンは次のようになります。

$httpRegex = '^\b(?:(?:https?|ftp|file):\/\/|(www|ftp)\.)[-A-Z0-9+&@#\/%\?=~_|$!:,.;]*[-A-Z0-9+&@#\/%=~_|$]^i';
于 2012-10-18T02:01:00.717 に答える