2011-09-15 6 views
1

テキストに見つかった場合、特定の単語/文字列をリンクのようにしたいと思います。私はそれを行うphp.betのコードを持っていますが、タグの先頭と末尾も<a href="http://www.domain.com/index.php" title="Home">go to homepage</a>から削除します。これを解決するのに手伝ってくれますか?ここでPHPトークンがhtmlエンティティを置き換えます

は、コードの一部です:

<?php 

$str_in = '<p>Hi there worm! You have a disease!</p><a href="http://www.domain.com/index.php" title="Home">go to homepage</a>'; 
$replaces=  array(
       'worm' => 'http://www.domain.com/index.php/worm.html', 
       'disease' => 'http://www.domain.com/index.php/disease.html' 
       ); 

function addLinks($str_in, $replaces) 
{ 
    $str_out = ''; 
    $tok = strtok($str_in, '<>'); 
    $must_replace = (substr($str_in, 0, 1) !== '<'); 
    while ($tok !== false) { 
    if ($must_replace) { 
     foreach ($replaces as $tag => $href) { 
     if (preg_match('/\b' . $tag . '\b/i', $tok)) { 
      $tok = preg_replace(
           '/\b(' . $tag . ')\b/i', 
           '<a title="' . $tag . '" href="' . $href . '">\1</a>', 
           $tok, 
           1); 
      unset($replaces[$tag]); 
     } 
     } 
    } else { 
     $tok = "<$tok>"; 
    } 
    $str_out .= $tok; 
    $tok = strtok('<>'); 
    $must_replace = !$must_replace; 
    } 
    return $str_out; 
} 

echo addLinks($str_in, $replaces); 

結果は次のとおりです。

こんにちはワーム!あなたは病気です!

のhref =「http://www.domain.com/index.php」タイトル=「ホーム」/

「ワーム」と「病気」の言葉は、所望のようにリンクに変換され残りの部分は...

ありがとう!あなたはその大規模な建設を持っている理由

+1

+1は、研究努力を示すよく考えられた質問です。 – Herbert

答えて

1

この関数は、正規表現またはstr_replaceを使用してHTMLを解析する際に発生する問題を回避します。

function process($node, $replaceRules) 
{ 
    if($node->hasChildNodes()) { 
     $nodes = array(); 
     foreach ($node->childNodes as $childNode) { 
      $nodes[] = $childNode; 
     } 
     foreach ($nodes as $childNode) { 
      if ($childNode instanceof DOMText) { 
       $text = preg_replace(
        array_keys($replaceRules), 
        array_values($replaceRules), 
        $childNode->wholeText); 
       $node->replaceChild(new DOMText($text),$childNode); 
      } 
      else { 
       process($childNode, $replaceRules); 
      } 
     } 
    } 
} 

function addLinks($str_in, $replaces) 
{ 
    $replaceRules = array();  
    foreach($replaces as $k=>$v) { 
     $k = '/\b(' . $k . ')\b/i'; 
     $v = '<a href="' . $v . '">$1</a>'; 
     $replaceRules[$k] = $v; 
    } 

    $doc = new DOMDocument; 
    $doc->loadHTML($str_in); 
    process($doc->documentElement, $replaceRules); 
    return html_entity_decode($doc->saveHTML()); 
} 

注: HTMLがうまく構造化されていない場合は(あなたの例のように)心配する必要はありません。しかし、出力はうまく構成されます。原因それ’の

クレジット:実際の作業のほとんどを行い 再帰process()機能は、How to replace text in HTMLにルーカス・ラリンズキー’の答えからdireclty来ます。 addLinks()関数は、あなたの質問に合わせて作られた単なるユースケースです。

+0

あなたは男です!感謝万円!!! –

0

わからない、ときに何かのように:

$str_out = preg_replace('/(' . preg_quote(implode('|', array_keys($replaces))) . ')/', $replaces[$1], $str_in); 

が同じことを成し遂げるでしょう。もちろん、正規表現を使ってHTMLを処理するのはhazardous processです。より確実にこれを行うには、いくつかのxpathでDOMを使用する必要があります。

+0

この場合、$は[$ 1]を置き換えますか?私はエラーを投げるので、これを求めています。ありがとう! –

+0

コードが機能していないようです。誰もこのケースでhtmlエンティティを混乱させるのを避ける方法を知っていますか? もう一度おねがいします! –

関連する問題