字符串替换字母忽略HTML标记和元素

时间:2014-06-26 01:15:49

标签: php html replace

这段代码几乎完全符合我的要求。唯一的问题是它还会替换HTML标记和元素。我想让这段代码忽略那些HTML标签和元素,并且只替换< ...>中不包含的字母。标签。

目前,它用另一个字母替换每个字母UPPER和LOWER。它还可以防止已经替换的字母再次被替换。这很精彩。如果我可以删除标签并将其保留为纯文本,我会这样做,但这不是理想的结果。

这需要适用于简单或复杂的字符串。这仅仅是为此做的简单版本。

Tags that could be included <p><br><strong><b><em><i><u><strike><s>

$foo = '
<p>
The <i>foobar</i> walks down the street.
<br />
<br />
<b style="font-size: 10px;">Foo!</b>
<br />
<br />
<strike>Foobar.</strike>
</p>
<p>
The <i>foobar</i> walks down the street.
<br />
<br />
<b style="font-size: 10px;">Foo!</b>
<br />
<br />
<strike>Foobar.</strike>
</p>
';

$replaces = array(
'A' => 'Q',
'B' => 'F',
'C' => 'J',
'D' => 'T',
'E' => 'C',
'F' => 'W',
'G' => 'N',
'H' => 'Y',
'I' => 'L',
'J' => 'H',
'K' => 'S',
'L' => 'V',
'M' => 'Z',
'N' => 'X',
'O' => 'U',
'P' => 'R',
'Q' => 'M',
'R' => 'P',
'S' => 'O',
'T' => 'K',
'U' => 'I',
'V' => 'G',
'W' => 'A',
'X' => 'B',
'Y' => 'D',
'Z' => 'E',
'a' => 'f',
'b' => 'o',
'c' => 't',
'd' => 'k',
'e' => 'i',
'f' => 'd',
'g' => 'u',
'h' => 'r',
'i' => 'p',
'j' => 'x',
'k' => 'z',
'l' => 'q',
'm' => 's',
'n' => 'v',
'o' => 'w',
'p' => 'y',
'q' => 'n',
'r' => 'l',
's' => 'm',
't' => 'j',
'u' => 'a',
'v' => 'g',
'w' => 'e',
'x' => 'b',
'y' => 'c',
'z' => 'h',
);

for( $i=0,$l=strlen($foo_replace);$i<$l;$i++ ){
    if( isset($replaces[$foo_replace[$i]]) ){
        $foo_replace[$i] = $replaces[$foo_replace[$i]];
    }
}

我一直在谷歌搜索如何替换和忽略html标签,但没有一个结果为我提供了一些实实在在的东西,也没有举例说明。唯一能看出正确答案的是HTML DOM Parser ......但是,我找不到任何适合这个特定问题的例子。因此,它没有那么有用。如果有人能够为我提供可以解决这个问题的解释或示例,那就太棒了。

修改

使用给出的答案,我试图找出它的含义。我没有给出使用解析器的链接,所以我不得不谷歌找到它。使用该代码删除了所有HTML,并将智能标记更改为奇怪的字符...不是我想要的。所以我一直在寻找使用PHP DOM类做到这一点的方法,我仍然无法弄明白。在做出我需要做的更改之后,我不知道如何将HTML标记放回原位。

这是我最终尝试这样做的结果......

function encodeMe($str , $replaces){
    for( $i=0;$i<strlen($str);$i++ ){
        if(isset($replaces[$str[$i]]) ){
        $str[$i] = $replaces[$str[$i]];
    }
}
return $str;
}

$dom = new DOMDocument;
$dom->loadHTML($chapter_replace);
$nodes = $dom->childNodes;
foreach($nodes as $node) {

for($i=0,$l=strlen($node);$i<$l;$i++){
    if(isset($replaces[$node[$i]])){
        $node[$i] = $replaces[$node[$i]];
    }
}

}
$chapter_replace = $dom->saveHTML();

1 个答案:

答案 0 :(得分:2)

这应该让你开始......

  $str = 'The red hen walks down the street. <b style="font-size: 10px;">Bang!</b> The end.';

  $DOM = new DOMDocument;
  $DOM->loadHTML($str);

  // The encoding functin
  function encodeMe($str , $replaces){
    for( $i=0;$i<strlen($str);$i++ ){
        if( isset($replaces[$str[$i]]) ){
         $str[$i] = $replaces[$str[$i]];
        }
     }
     return $str;
   }

   // Loop through the DOM, and build an encoded string
   // Here you can figure out a way to also attach the html tag to the front
   // To retain the tags uncoded.  But I didn't take the time to do that.
   // This should be enough to get you started though
       $newString="";
       foreach ($DOM->childNodes as $node)
        {
          $newString.=encodeMe($node->nodeValue, $replaces);

          // Pseudocode of how you might do it...
          // $newString.= attach front tag. encodeMe($node->nodeValue, $replaces). attach back tag;
        };

  echo $newString;

这将是这些方面的事情,但并不完全。你一定要玩abit ...但这只是为了让你开始

修改

这是一种破坏性的方式。没有DOMDocument ....但它确实有效。

      $str = '<span class="test">The red hen walks down the street.</span> <span class="second">Bang!</span> The end.';
      $html=array();
      //Explode your html string, by the < tag
      $firstEx = explode("<",$str);

      $i=0;
      // Loop through that array, and explode the > tag, encode the text portion
      // and store the pair in the $html array
      foreach($firstEx as $t){
         $i++;
         $tmp = explode(">",$t);
         $html[$i]['tag'] = $tmp[0];
         if(isset($tmp[1])){
           $html[$i]['inner']=encodeMe($tmp[1],$replaces);
         }
      }

         //Loop through that pair array, and build the new string
         $newString="";
         foreach($html as $h){
          if(!empty($h['tag'])){
            $newString.="<".$h['tag'].">";
          }
          if(!empty($h['inner'])){
             $newString.=$h['inner'];
          }
         }

        // VIOLA!
        echo $newString;


        // The string encoding function
        function encodeMe($str , $replaces){
         for( $i=0;$i<strlen($str);$i++ ){
           if( isset($replaces[$str[$i]]) ){
            $str[$i] = $replaces[$str[$i]];
           }
         }
         return $str;
        }

此处示例 EXAMPLE HERE