替换 PHP 字符串的一部分

3

我需要正则表达式来替换<>&&lt;&gt;&amp;,但是我只想替换<body></body>标签中的这些字符。

示例

替换之前:

<head> <><><>& </head> <body><><>&</body>

替换后
<head> <><><>& </head> <body>&lt;&gt;&lt;&gt;&amp;</body>

谢谢您的选择 :)
3个回答

0

描述

要用正则表达式完成这个任务,需要分几步进行:

  1. 捕获正文字符串:

    正则表达式:(^.*?<body>)(.*)(<\/body>)$

    enter image description here

    匹配结果:

    [0] => <head> <><><>& </head> <body><><>&</body>
    [1] => <head> <><><>& </head> <body>
    [2] => <><>&
    [3] => </body>
    
  2. 分别替换匹配结果中的每种字符

  3. 重构字符串

PHP代码示例

$sourcestring="<head> <><><>& </head> <body><><>&</body>";
preg_match('/(^.*?<body>)(.*)(<\/body>)$/ims',$sourcestring,$matches);

$header=$Matches[1];
$body=$matches[2];
$footer=$Matches[3];

$body = preg_replace('/</ims','&lt;',$body);
$body = preg_replace('/>/ims','&gt;',$body);
$body = preg_replace('/&/ims','&amp;',$body);

$output = $header . $body . $footer;

0

我用了一些技巧来完成它。首先,我找到了在 body 标签之间的文本,然后将其更改为 HTML 特殊字符并保存。接着,我用 [TO_BE_REPLACED] 替换了 body 标签之间的文本,最后再用 htmlspecialchars() 转义替换文本。

<?php
$str = '<head> <><><>& </head> <body><><>&</body>';
preg_match('/<body>(.*?)<\/body>/', $str, $match);
$special = htmlspecialchars($match[1]); // you can use html entities as well
$str = preg_replace('/<body>(.*?)<\/body>/','<body>[TO_BE_REPLACED]</body>',$str);
echo htmlspecialchars(str_replace('[TO_BE_REPLACED]', $special, $str)); //this one is only to show purpose
echo '<br>----<br>';
echo str_replace('[TO_BE_REPLACED]', $special, $str);
?>

查看演示


这也将双引号和单引号更改为它们各自的字符,这在原帖中没有包括。 - Ro Yo Mi
@Denomales如果不需要htmlspecialchars(),他可以使用带有str_replace的数组。他没有提到替换这些字符。 - Robert
是的,然而他非常明确哪些字符需要被替换。 - Ro Yo Mi
@Denomales 看起来就像是HTML编码... 顺便说一下,你的答案使用了3次preg_replace,而你可以只使用一次并传递2个数组,一个作为模式数组,另一个作为替换数组,但最简单的方法是使用str_replace,并将数组作为参数。写"<"的正则表达式有什么意义呢?我看不出来。 - Robert

0

我认为你真正需要的是:

  1. 一个XML解析器来解析你的字符串并获取 <body> 部分。请参考this question以获取更多信息;
  2. htmlspecialchars() 用于结果。

编辑:如果你确切地知道HTML的样式,当然也可以在 </head><body> 上使用 explode 将输入拆分成两部分,但这高度依赖于输入的确切格式,因此我不建议这样做。


我需要这个是因为我有一个包含<body><body>中的<, >和&的大型XML文件,simplexml_load_file()无法读取该文件。 现在我使用file_get_content加载文件,然后想用preg_replace替换。 - php12345
@php12345 或许类似于XMLReader的东西可以使用,参考我提供的链接。 - jeroen

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