【发布时间】:2021-06-02 19:02:36
【问题描述】:
我想替换>和<之间的所有字符串,例如用foo替换center(摘自:> is the sun the center of the universe?:<),但不要替换center(摘自:<...center;">)。
我正在使用以下命令:
perl -pi -w -e 's/center/foo/g;' file.html
所以我尝试使用replace all "foo" between two HTML tags using REGEX (PHP code),变成这样:
perl -pi -w -e 's/(?<![\w$<])\$\(center\)(?![\w$>])/foo/g;' file.html
但它不能正常工作。我在网上搜索,最接近我需要的是Perl string replace: Match, but not replace, part of regex、Perl Regex - Search and replace between tags only if string is in-between 和Replace text in string with exceptions。但是我不能完全解决只替换不是<center> 的字符串的需要。
fragment_html_code:
</td></tr><tr><th colspan="2" class="" style="text-align:center;">is the sun the center of the universe?:</th></tr><tr class=""><td colspan="2" class="" style="text-align:center;">
center </td></tr>
编辑更新:
关于 Lordadmira 解决方案:
每次和>之间有换行,代码就会失败。例如当要替换的单词像(这里有一个换行符)center >时失败。会发生什么?请参阅下面的上下文示例:
</td></tr><tr><th colspan="2" class="" style="text-align:center;">
(Here there is a line jump and then the solution of Lordadmira fails and does not occur) ----> is the sun the center of the universe?:
</th></tr><tr class=""><td colspan="2" class="" style="text-align:center;">
center </td></tr>
编辑更新 01:
我将最初的 Lordadmira 解决方案 修改为 perl -0777 -pi -w -e 's{>\K[^<]*?\K.foo[^<]*(?=<).}{ bar }g;' file.html 或 perl -0777 -pi -w -e 's{>\K[^<]*?\K.foo.[^<]*(?=<).}{ bar }g;' file.html,这适用于换行符,但它会删除 foo 之后的所有内容。我尝试了几种方法来避免删除 foo 后的文本,但我一直无法得到解决方案。如果我设法解决了这个问题,那么问题将得到充分回答。
编辑更新 02:
我现在已将我的修改从 EDIT UPDATE 01 中的 Lordadmira 更改为 perl -0777 -pi -w -e 's{>\K[^<]*?\K.foo.[^<](?!=<)}{ bar }g;',以纠正 foo 之后的文本之前已被删除的事实。但是这是删除foo之后的字符串的第一个字符,我想说例如在
> "lorem
foo ipsum "<
当foo被替换时,结果不是预期的,因为我得到>" lorem bar psum "<,即ipsum "i"被删除。
下面的解决方案解决了每次替换删除 foo 后字符串中有字符的问题。目前,在广泛的背景下,这是对 Lordadmira 最初解决方案最实用的改编。
为了解决这个问题,有必要在 foo 的末尾省略操作符点,并在Regex matching line not containing the string 处添加负前瞻作为附加解释,并在"Positive and Negative Lookahead" 部分进行详尽的补贴,
将属于Lordadmira的初始解决方案的部分(?=<)修改为(?!=<)。
perl -0777 -pi -w -e 's{>\K[^<]*?\K.foo[^<](?!=<)}{ bar }g;'
编辑更新 3:
经过多次测试,我相信我的意图已经达到了最令人满意的解决方案。
perl -0777 -pi -w -e 's{>[^
【问题讨论】:
-
perl -pi -w -e 's/(?<=>)[^<]+(?=<)/foo/g;' file.html呢,还是需要专门匹配“center”? -
@JerryJeremiah,至于指定中心,它仅适用于
fragment_code_html与 MWE 一起服务,但我也需要替换center周围的许多其他字符串。尽管更好地考虑中心周围是否存在其他字符串可能会影响解决方案。
标签: html perl html-parsing