我有以下html
<!-- START: .paragraph-content -->
<div class="paragraph-content">
<div class="container"><div class="row"><div class="col-sm-10">
<!-- START: .paragraph-columns -->
<div class="paragraph-columns">
<div class="field-wysiwyg">
<div data-quickedit-field-id="paragraph/167/field_mt_body/en/default" class="field field--name-field-mt-body field--type-text-long field--label-hidden field__items">
<div class="field__item">
<h2> </h2>
<h2> </h2>
<h2>INNOVATION.</h2>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
</div>
</div>
</div>
<!-- END: .paragraph-columns -->
</div></div></div>
</div>
<!-- END: .paragraph-content -->
我想捕获html以<div class="paragraph-content">
开头的位置
在该区块中,我想将<h2>
更改为<h1>
因此最终结果将如下所示:
<!-- START: .paragraph-content -->
<div class="paragraph-content">
<div class="container"><div class="row"><div class="col-sm-10">
<!-- START: .paragraph-columns -->
<div class="paragraph-columns">
<div class="field-wysiwyg">
<div data-quickedit-field-id="paragraph/167/field_mt_body/en/default" class="field field--name-field-mt-body field--type-text-long field--label-hidden field__items">
<div class="field__item">
<h2> </h2>
<h2> </h2>
<h1>INNOVATION.</h1>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
</div>
</div>
</div>
<!-- END: .paragraph-columns -->
</div></div></div>
</div>
<!-- END: .paragraph-content -->
我已经使用此正则表达式模式进行了尝试,但没有任何效果:
'/(?:<h2((?!\s").*?)?>)(.*?)(?:<\/h2>)/si'
答案 0 :(得分:0)
如果您将HTML页面作为字符串变量,则可以通过以下方式完成:
$fileStr = file_get_contents('HTML_FILE.htm');
然后,您可以通过使用文本“ <!-- START: .paragraph-content -->
”找到要查找的部分的开头,并通过使用文本“ <!-- END: .paragraph-content -->
”来找到字符串的部分的结尾。
具有字符串的开头和结尾,我们可以提取$ fileStr中要对其运行正则表达式的部分。
找到要更改的字符串所需的正则表达式为:
<h2>.{2,}<\/h2>
您必须提取<h2>
和</h2>
并将其替换为<h1>
和</h1>
,同时保留它们之间的所有内容。
这样做并不是一个简单而整洁的解决方案。我将执行一个循环,查找<h2>
,然后查找与结束</h2>
之间是否存在任何字母数字,然后提取两者之间的内容(如果有),并适当地替换标签。
虽然没有为您提供剪切和粘贴的代码,但我希望我能给您一些思考的地方。
答案 1 :(得分:0)
Regex用作有限状态机,它无法解析递归的内容,例如可能包含其他XML标签的XML标签。
基本上,您不能完全匹配与开始标记匹配的结束标记,因为这需要递归,这在有限状态机中是不可能的(存在具有递归和某些其他实现的Python模块regex
,但是这不是真正的正则表达式。)
要想准确地解决问题,您需要一个完整的自上而下的递归解析器或一些专门用于XML / HTML的工具。
只需在整个正则表达式字符串中用h2
替换h1
标记,就和<(/?)h2>
-> <$1h1>
一样简单。