1

我从 rte 读取内容,在将它们提交到服务器之前,我需要在一些标题属性中替换 <它们>的 html 实体。我不想在这里使用 Dom-Operations,因为我在这里得到的只是文本表示。我正在寻找的是一个转换这个的正则表达式

<div>ABCD<img style="max-height: 25px; max-width: 25px;" class="inlinetag" 
  src="http://my_images/icon.gif" 
  title="<ir_inline itemname=bild_1 type=0><cbd>"> EFG</div>

进入这个

<div>ABCD<img style="max-height: 25px; max-width: 25px;" class="inlinetag" 
  src="http://my_images/icon.gif" 
  title="&lt;inline itemname=bild_1 type=0&gt;&lt;cbd&gt;"> EFG</div>

如何才能做到这一点?

4

4 回答 4

1

试试这个 JS 函数:

function title_replace() {
    var str = '<div>ABCD<img style="max-height: 25px; max-width: 25px;" class="inlinetag" \
  src="http://my_images/icon.gif" \
  title="<ir_inline itemname=bild_1 type=0><cbd>"> EFG</div>';
    var re = new RegExp(/title="(.|[\s\S])+?"/gm);
    var title = "";
    while (title_matches = re.exec(str)) {
        title = title_matches[0];
        var new_title = title.replace(/</gm,"&lt;").replace(/>/gm,"&gt;");
        str = str.replace(title, new_title);
    }
}

编辑:

我已经删除了 dom 上的所有工作,现在都是 JS。看看这是否适合你。

于 2013-01-28T09:46:43.933 回答
1

纯正则表达式解决方案:

var input = "title=\"<ir_inline itemname=bild_1 type=0><cbd>\""; //use the entire input
var myRegexp = /title=\"(.*?)\"/g; // get all title attributes
var output = input.replace(myRegexp,function(a){return a.replace(/</g,"&lt;").replace(/>/g,"&gt;");});

我已经用您的示例输入和输出对其进行了测试。它应该工作。

于 2013-01-28T10:26:08.297 回答
1

所以让我假设几件事,你有一个带有html标签和属性的纯文本,你只想把它当作纯文本,可能是因为你在服务器端得到这个文本。

除了正则表达式,如果您更喜欢通过循环进行字符串操作,那么下面是简单的循环(逻辑),通过它您可以实现您想要的。

我假设您需要在服务器端执行此操作,因此我为此使用了 C#,您可以使用任何语言,甚至是 javascript 来执行此循环。

 string sourceText = "<div id=\"target\" ><div>ABCD<img style=\"max-height: 25px; max-width: 25px;\" class=\"inlinetag\" " +
                            "src=\"http://my_images/icon.gif\\" +
                            "title=\"<ir_inline itemname=bild_1 type=0><cbd>\"> EFG</div>" +
                        "</div>";
 string targetText = sourceText;
 bool traceOn = false;
 for (int i = 0; i < targetText.Length; i++)
 {
    if (traceOn)
       if (targetText[i] == '"')
            traceOn = false;

   if (traceOn)
   {
        if (targetText[i] == '<')
        {
             targetText = targetText.Remove(i, 1).Insert(i, "&lt;");
        }
        if (targetText[i] == '>')
        {
            targetText = targetText.Remove(i, 1).Insert(i, "&gt;");
        }
   }
   if (targetText[i] == '"')
   {
        if (targetText[i - 1] == '=')
          traceOn = true;
   }
}
        }

所以基本上我正在做的是为你的替换操作模式,即你只需要替换那些出现在双引号内并且前面还有一个'='的<和>。它完美地工作。

这不是一个完美的解决方案,但它应该给你和想法,你可以如何处理你的字符串。这里有人可以编写更强大和更灵活的逻辑。尝试/改进它。

其他解决方案可以是,将您的整个字符串视为 xml。即几乎所有服务器端语言都提供了将字符串处理为xml 的工具。找到适合您需要的,即

我本可以做类似的事情

XmlDocument doc = new Xmldocument();
doc.LoadXml(targetString);

and then I could easily retrieve any tag and its attribute.

至于正则表达式,我很害怕它们。它应该给你一个想法。

于 2013-01-28T11:47:41.993 回答
0

在服务器端尝试antisamy 。它功能强大且安全。

于 2013-01-28T09:23:21.563 回答