php搜索和替换<;h2>;至<;h1>;在我看来,来源
我有下面的htmlphp搜索和替换<;h2>;至<;h1>;在我看来,来源,php,regex,Php,Regex,我有下面的html <!-- START: .paragraph-content --> <div class="paragraph-content"> <div class="container"><div class="row"><div class="col-sm-10"> <!-- START: .paragraph-columns -->
<!-- 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以
在该块中,我想将
更改为
因此最终结果如下所示:
<!-- 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'
”/(?:如果将HTML页面作为字符串变量,则通过以下方式完成:
$fileStr = file_get_contents('HTML_FILE.htm');
然后,您可以使用文本“
”找到您要查找的部分的开头,并使用文本“
”找到字符串部分的结尾
有了字符串的开头和结尾,我们可以提取$fileStr中要对其运行正则表达式的部分
查找要更改的字符串所需的正则表达式为:
<h2>.{2,}<\/h2>
{2,}
问题是,您必须提取
和
并将其替换为
和
,同时保留两者之间的所有内容
这样做并不是一个简单而整洁的解决方案。我会做一个循环,查找
,然后找出它和结束
之间是否有字母数字,然后提取两者之间的内容(如果有),适当地替换标记
虽然没有为您提供剪切和粘贴的代码,但我希望我给了您一些思考的东西。正则表达式作为一个有限状态机工作,它无法解析递归的东西,比如可能包含其他XML标记的XML标记
基本上,您无法精确匹配与开始标记匹配的结束标记,因为这需要递归,这在有限状态机中是不可能的(有Python模块regex
具有递归和一些其他实现,但这不是真正的regex)
例如,对于您的问题,您需要一个完整的自上而下的递归解析器或一些专门用于XML/HTML的工具
只需在整个正则表达式字符串中将h2
标记替换为h1
,就如同
->
一样简单。正则表达式可能不是用于此目的的正确工具。使用代替正则表达式。有3个h2
标记,并且您在预期输出中只更改了一个。这是错误吗?如果您只想更改是一个你需要解释的原因。是因为它是Exclety 3rd,还是因为它有内容而其他人没有,还是其他原因?@我想替换带有内容的一个。你能提供一个例子吗?HTML是如何生成的?只是如果你只想用内容替换第三个标记或任何标记,解决方案会有所不同我认为,如果要替换的标记相对于HTML部分位于同一位置,那么它就变得容易多了。