php在我的视图源中搜索并将<h2>替换为</h2> <h1>

时间:2019-04-02 13:25:31

标签: php regex

我有以下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'

2 个答案:

答案 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>一样简单。