这段代码几乎完全符合我的要求。唯一的问题是它还会替换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();
答案 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