PHP: 如何将所有HTML标签中的单引号转换为双引号?

6
如何将所有HTML标签中的单引号转换为双引号?有更简单的方法吗? 谢谢 :) 例如: 如何将此字符串(我的工作实际数据)进行转换:
<TEXTFORMAT LEADING='2'><P ALIGN='LEFT'><FONT FACE='Verdana' style="font-size:10' COLOR='#0B333C'>My name's Mark</FONT></P></TEXTFORMAT>

转换为:

<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Verdana" style="font-size:10" COLOR="#0B333C">My name's Mark</FONT></P></TEXTFORMAT>
6个回答

3
我假设你所说的所有html标记是指包含属性的所有单引号。你不会想要将<a onclick="alert('hi')">转换,因为这会破坏代码。
任何正则表达式都会很脆弱。如果你知道输入将是一组特定的简单情况,你可能可以使用正则表达式。否则,你需要一个理解复杂html标记的DOM解析器,例如 onmouseover="(function () { document.getElementById(''); alert(\"...\")...})()"(例如)。此外,属性可以跨越多行。 ;)
我最近没有遇到过这个特定的问题,但也许有一种好的方法可以使用HTML Tidy(更多信息请参见:http://devzone.zend.com/article/761)或像这个http://sourceforge.net/projects/simplehtmldom/的解析器来解决它。

@Keith:在我的HTML标签中,我没有任何类似于document.getElementById('')的Javascript相关代码,所以只要能解决我的问题,我就可以使用任何正则表达式:D谢谢,我会查看您发布的链接。 - marknt15
你会有 CSS 的机会吗?例如 style="background: url('/images/bg.gif');" - Keith Bentrup
@Keith:不,我不会有样式属性。 - marknt15
等一下,我在你的例子中看到一个 ;) - Keith Bentrup
嗯,我刚刚将 'size="10"' 属性转换为 style="font-size:10px;",但我不会在我的 HTML 标签内使用任何单引号 :) - marknt15
我猜我会从两个正则表达式开始,一个用于查找HTML标记内的所有内容,例如 /<([^>]+)>/g,然后对于每个标记,执行类似 preg_replace("/='([^']*)'/g", '="$1"') 的操作...作为一个开始,希望能帮到你...不过没有保证,我今晚要下线了 ;) - Keith Bentrup

2
如果您不关心其他地方提到的JavaScript和CSS问题,请尝试这个:
$text = "<TEXTFORMAT LEADING='2'><P ALIGN='LEFT'><FONT FACE='Verdana' style='font-size:10' COLOR='#0B333C'>My name's Mark</FONT></P></TEXTFORMAT>";
echo preg_replace('/<([^<>]+)>/e', '"<" . str_replace("\\\\\'", \'"\', "$1") . ">"', $text);

这是从一个与您完全相同问题的人的帖子中提取的,该帖子位于 devshed.com

嗨小福,我试过了,但它没起作用?嗯,我再试一次 :) - marknt15
我的代码示例略有不妥,记住更新后的字符串是 preg_replace 的返回值。(已更新答案以反映这一点) - Xiaofu
@xiaofu:只有使用这个示例代码才能使它正常工作: $texts = "<p class='essay_caption'>This is Bob's test</p>"; $zzz = preg_replace('/<([^<>]+)>/e', '"<" . str_replace("\\'", '"', "$1") . ">"', $texts); echo htmlspecialchars($zzz); - marknt15
如果你已经考虑到了这个问题,但仍然无法解决,请告诉我,我会删除这个答案。 - Xiaofu
@Xiaofu 我想把双引号转换成单引号,我该如何更改上面的 preg_replace?请给予建议。 - user5534204

1

我知道我可以使用正则表达式,但是试一试这种方法:使用fopen(),fread()等函数将内容分配给$string

$string = str_replace("'", '"', $string);
$array = explode('>', $string);
foreach($array as $key => $value){
    if(strpos($value, '<') <> 0 ){
       $array[$key] = str_replace('"', "'",$value);
    }
}
$string = implode('>',$array);

1
使用Tidy可以修复您的HTML代码并输出干净的XHTML。它还可以解决嵌套问题、标签小写等等。

不,tidy 没有这个转换。 - milahu

0

不是很确定您想要完成什么...使用 PHP 替换字符串的一部分可以使用 str_replace 函数:

str_replace("'", "\"", $yourString);

在此基础上,您可以使用PHP的输出缓冲器来回调整个主体,并像处理字符串一样对其使用str_replace。 - Sam Becker
他们希望它仅适用于 HTML 标签内部。 - garrow
“我的名字是马克”会发生什么? - NinethSense
@NinethSense - 啊,原来是这样...他想要将所有的 ' 替换为 ",但只有在 HTML 标签内部才能替换。也许一个聪明的正则表达式可以解决问题,但那不是我的专长。 - Daan
嗨,Daan,如果我执行这个 str_replace("'", """, $yourString); 那么任何在 HTML 标签之外的单引号也会受到影响,所以 "My name's Mark" 将变成 "My name"s Mark"。 - marknt15

0
我会选择使用dom解析器或自己编写一个简单的标签解析器,它能够理解引用以及转义引号字符,这样就不会将"he said \"blah\""解析成he said \blah\空字符串
它可以轻松地检测到需要修改的引用是否在标签内部。多年来,我已经学会了正则表达式对于这种任务来说过于脆弱的教训。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接