替换一些文本后保留HTML格式(使用PHP和JS)

Sad*_*adi 15 html javascript php string replace

我想修改HTML之类的

I am <b>Sadi, novice</b> programmer.
Run Code Online (Sandbox Code Playgroud)

I am <b>Sadi, learner</b> programmer.
Run Code Online (Sandbox Code Playgroud)

要做到这一点,我将使用字符串" 新手程序员 "进行搜索.我该怎么办?任何的想法?

它使用多个单词"新手程序员"进行搜索.这可能是一个完整的句子.应忽略额外的空白区域(例如新行,制表符),并且在搜索过程中必须忽略任何标记.但在更换标签期间必须保留.

它是一种转换器.如果它不区分大小写会更好.

谢谢

萨迪


更多说明:

我得到了一些很好的解决方案.但如果您有任何想法,请继续发帖.

我想更多地澄清问题,万一有人错过了.主要帖子将问题显示为示例场景.

1)现在问题是找到并替换一些字符串而不考虑标签.标签可以显示在单个单词中.字符串可能包含多个单词.标记仅出现在内容字符串或文档中.搜索词组从不包含任何标签.

我们可以轻松删除所有标签并进行一些文本操作.但是这里出现了另一个问题.

2)即使在替换文本后,标签也必须保留.这就是示例所示.

再次感谢您的帮助

chr*_*ris 4

好吧,我想这就是你想要的。它需要您的输入搜索和替换,将它们分割成由空格分隔的字符串数组,生成一个正则表达式,查找具有任意数量的空格/html标签的输入句子,并将其替换为在单词之间替换相同标签的替换句子。

如果搜索句子的字数高于替换句子的字数,则它仅在任何额外单词之间使用空格,如果替换字数高于搜索句子,则它将在末尾添加所有“孤立”标签。它还处理查找和替换中的正则表达式字符。

<?php
function htmlFriendlySearchAndReplace($find, $replace, $subject) {
    $findWords = explode(" ", $find);
    $replaceWords = explode(" ", $replace);

    $findRegexp = "/";
    for ($i = 0; $i < count($findWords); $i++) {
        $findRegexp .= preg_replace("/([\\$\\^\\|\\.\\+\\*\\?\\(\\)\\[\\]\\{\\}\\\\\\-])/", "\\\\$1", $findWords[$i]);
        if ($i < count($findWords) - 1) {
            $findRegexp .= "(\s?(?:<[^>]*>)?\s(?:<[^>]*>)?)";
        }
    }
    $findRegexp .= "/i";

    $replaceRegexp = "";
    for ($i = 0; $i < count($findWords) || $i < count($replaceWords); $i++) {
        if ($i < count($replaceWords)) {
            $replaceRegexp .= str_replace("$", "\\$", $replaceWords[$i]);
        }
        if ($i < count($findWords) - 1) {
            $replaceRegexp .= "$" . ($i + 1);
        } else {
            if ($i < count($replaceWords) - 1) {
                $replaceRegexp .= " ";
            }
        }
    }

    return preg_replace($findRegexp, $replaceRegexp, $subject);
}
?>
Run Code Online (Sandbox Code Playgroud)

以下是一些测试的结果:

Original : <b>Novice Programmer</b>
Search : Novice Programmer
Replace : Advanced Programmer
Result : <b>Advanced Programmer</b>

Original : Hi, <b>Novice Programmer</b>
Search : Novice Programmer
Replace : Advanced Programmer
Result : Hi, <b>Advanced Programmer</b>

Original : I am not a <b>Novice</b> Programmer
Search : Novice Programmer
Replace : Advanced Programmer
Result : I am not a <b>Advanced</b> Programmer

Original : Novice <b>Programmer</b> in the house
Search : Novice Programmer
Replace : Advanced Programmer
Result : Advanced <b>Programmer</b> in the house

Original : <i>I am not a <b>Novice</b> Programmer</i>
Search : Novice Programmer
Replace : Advanced Programmer
Result : <i>I am not a <b>Advanced</b> Programmer</i>

Original : I am not a <b><i>Novice</i> Programmer</b> any more
Search : Novice Programmer
Replace : Advanced Programmer
Result : I am not a <b><i>Advanced</i> Programmer</b> any more

Original : I am not a <b><i>Novice</i></b> Programmer any more
Search : Novice Programmer
Replace : Advanced Programmer
Result : I am not a <b><i>Advanced</i></b> Programmer any more

Original : I am not a Novice<b> <i> </i></b> Programmer any more
Search : Novice Programmer
Replace : Advanced Programmer
Result : I am not a Advanced<b> <i> </i></b> Programmer any more

Original : I am not a Novice <b><i> </i></b> Programmer any more
Search : Novice Programmer
Replace : Advanced Programmer
Result : I am not a Advanced <b><i> </i></b> Programmer any more

Original : <i>I am a <b>Novice</b> Programmer</i> too, now
Search : Novice Programmer too
Replace : Advanced Programmer
Result : <i>I am a <b>Advanced</b> Programmer</i> , now

Original : <i>I am a <b>Novice</b> Programmer</i>, now
Search : Novice Programmer
Replace : Advanced Programmer Too
Result : <i>I am a <b>Advanced</b> Programmer Too</i>, now

Original : <i>I make <b>No money</b>, now</i>
Search : No money
Replace : Mucho$1 Dollar$
Result : <i>I make <b>Mucho$1 Dollar$</b>, now</i>

Original : <i>I like regexp, you can do [A-Z]</i>
Search : [A-Z]
Replace : [Z-A]
Result : <i>I like regexp, you can do [Z-A]</i>
Run Code Online (Sandbox Code Playgroud)