php 仅替换开始HTML标记内不需要的字符

vkc1a9a2  于 2023-02-07  发布在  PHP
关注(0)|答案(4)|浏览(128)

我需要在脚本中做一些修改。
我需要打开iframe标记内的2个特定字符(»)更改为双引号(")。
例如:

<iframe src=»http://test.test″>»hellohello»</iframe>

需要变成:

<iframe src="http://test.test">»hellohello»</iframe>

我的代码到目前为止:

$content = preg_replace("/\<[“]\>/","\"",$content); 
$content = preg_replace("/\<[»]\>/","\"",$content);

但这并不像预期的那样起作用。

yxyvkwin

yxyvkwin1#

你有错误的正则表达式内。

$content = preg_replace("/\<[“]\>/","\"",$content);

它的确切意思是:

<“>

将替换为报价。其他站点的工作示例:

$content = preg_replace('/<([^<>]+)>/e', '"<" .str_replace(""", \'"\', "$1").">"', $content);

这里使用了str_replace,你可以在那里传递任何引号。你应该对preg_replace_callback做同样的事情,它推荐给较新的PHP版本(从5.5 /e开始,标志被弃用)。示例(不确定它是否有效,但你明白了):

preg_replace_callback(
        '/<([^<>]+)>/',
        function ($matches) {
            return str_replace('OldQuote', 'NewQuote',$matches[0]);
        },
        $content
    );

或者用许多不同的引号创建数组:

preg_replace_callback(
        '/<([^<>]+)>/',
        function ($matches) {
            $quotes = array('OldQuote'=>'NewQuote','OldQuote2'=>'NewQuote2');
            return str_replace(array_keys($quotes), array_values($quotes),$matches[0]);
        },
        $content
    );
bqucvtff

bqucvtff2#

要替换开头iframe标记中的一个或多个恶意多字节字符(以HTML无知的方式),可以在preg_replace_callback()中调用strtr()str_replace()。(Demo

echo preg_replace_callback(
         '/<[^>]+>/',
         fn($m) => strtr($m[0], ['»' => '"', '“' => '"']),
         $tests
     );

或者

echo preg_replace_callback(
         '/<[^>]+>/',
         fn($m) => str_replace(['»', '“'], '"', $m[0]),
         $tests
     );

因为HTML是“损坏的”/无效的,所以可能不值得尝试使用适当的DOM解析器来纠正标记。

2ekbmq32

2ekbmq323#

这个应该可以

$content = preg_replace('/<(.+?)(?:»|“|″)(.+?)>/','<\1"\2>', $content);

一个regexp,匹配<>之间包含»的任何内容。替换为\1(第一个捕获组)。后跟"和\2(第二个捕获组)。
希望能有所帮助

qxsslcnc

qxsslcnc4#

一种解决方案是不使用preg_replace,如果格式与您所描述的相同,则可以简单地使用str_replace。

$str = '<iframe src=»http://test.test″>»hellohello»</iframe>';
$repl = str_replace(array('=»', '″>', '″/>'), array('"', '">'), $str);
print_r($repl);

相关问题