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を追求しました。