0

我有这段代码,但是 PHP 给了我一个Unknown modifier '?'错误。

有谁知道我做错了什么?(我在互联网上找到了代码,因为我不熟悉正则表达式)

$old = "<FONT></FONT><P></P><TR></TR>";
$newString = preg_replace("/</?\w+/e/", "strtolower('\\0')", $old);
echo $newString ."<br/>";
4

5 回答 5

5

PHP 5.4及更早版本:

$old = "<FONT></FONT><P id='P1'></P><TR></TR>"; 
$newString = preg_replace("/(<\/?\w+)(.*?>)/e", "strtolower('\\1') . '\\2'", $old); 
echo $newString ."<br/>"; 

自 PHP 5.5.0起不推荐使用e修饰符,请改用:preg_replace_callback

$old = "<FONT></FONT><P id='P1'></P><TR></TR>"; 
$newString = preg_replace_callback("/(<\/?\w+)(.*?>)/", function ($m) {
  return strtolower($m[1]) . $m[2]; }, $old); 
echo $newString ."<br/>"; 

输出:

<font></font><p id='P1'></p><tr></tr><br/>
于 2012-09-01T17:20:07.380 回答
0

</?\w+>应用小写后用自身替换正则表达式

于 2012-09-01T17:20:47.650 回答
0

这就是你要找的?

对于后代:此代码将处理属性注释和<!CDATA[[]]!>

<?php

function lowerTags($matches) {
    return strtolower($matches[1]);
}

$old = "<!--BLAH--><FONT COLOR='BLACK'>extra textCAPITALIZED</FONT><P></P><TR></TR>";

echo preg_replace_callback("/(<\/?[^!][^>]+)/", 'lowerTags', $old);
于 2012-09-01T17:25:25.523 回答
0

我不使用也不推荐正则表达式来解析html,但是这里有一些错误:

  1. 您正在使用该/符号作为分隔符,因此您需要在正则表达式中对其进行转义或使用另一个分隔符;
  2. 最后你有一个额外/的不应该在那里。

所以你的代码应该看起来像(使用另一个分隔符):

$newString = preg_replace("#</?\w+#e", "strtolower('\\0')", $old);
于 2012-09-01T17:27:04.447 回答
0

这是一个处理属性名称和标签的解决方案。请注意,这仍然不完全正确;它假定字符 > 永远不会在属性值中找到,例如图像的 alt 文本。要正确执行此操作,请使用 DOMDocument 类(但请注意解析器会遇到输入无效的问题)。

<?php

function lowercase_tag_name_callback(array $m) {
  return strtolower($m[1]) . lowercase_attribute_name($m[2]);
}
function lowercase_attribute_name_callback(array $m) {
  return ' ' . strtolower($m[1]) . $m[2];
}
// change each attribute name to lowercase
function lowercase_attribute_name($input) {
  $output = $input;
  $output = preg_replace_callback('# ([a-zA-Z]+)(="[^"]+")#', 'lowercase_attribute_name_callback', $output);
  $output = preg_replace_callback("# ([a-zA-Z]+)(='[^']+')#", 'lowercase_attribute_name_callback', $output);
  $output = preg_replace_callback('# ([a-zA-Z]+)(=[^"\']+[ >])#', 'lowercase_attribute_name_callback', $output);
  return $output;
}

$input = <<<'EOD'
<FONT></FONT><P id="P1"></P><TR></TR><IMG SRC="FourFive.jpg" ID='AnIDHere' ALT="FOUR five" CLASS=FourFive><!-- A Comment Here --><![CDATA[ CDATA Text Here ]]>

EOD;

$output = preg_replace_callback("#(</?\w+)(.*?>)#", 'lowercase_tag_name_callback', $input); 
print "BEFORE: $input";
print " AFTER: $output";
于 2017-06-05T15:08:40.050 回答