Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php搜索和替换<;h2>;至<;h1>;在我看来,来源_Php_Regex - Fatal编程技术网

php搜索和替换<;h2>;至<;h1>;在我看来,来源

php搜索和替换<;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 -->

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

在该块中,我想将
更改为

因此最终结果如下所示:

<!-- 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部分位于同一位置,那么它就变得容易多了。