Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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 preg_替换出现问题_Php_Preg Replace - Fatal编程技术网

PHP preg_替换出现问题

PHP preg_替换出现问题,php,preg-replace,Php,Preg Replace,好吧,假设我有以下文字 <h2><a name="test1"></a>Test 1</h2>test 1 text <h2><a name="test2"></a>Test 2</h2> test 2 text <h3><a name="test3"></a>Test 3</h3> test 3 text <h4><a name="t

好吧,假设我有以下文字

<h2><a name="test1"></a>Test 1</h2>test 1 text
<h2><a name="test2"></a>Test 2</h2>
test 2 text
<h3><a name="test3"></a>Test 3</h3>
test
3
text
<h4><a name="test4"></a>Test 4</h4>
<h4><a name="test5"></a>Test 5</h4>test 5 text
测试1测试1文本
测试2
测试2文本
测试3
测试
3.
文本
测试4
测试5测试5文本
我想使用正则表达式将该文本替换为以下内容:

<div class="toggle">
    <h2><a name="test1"></a>Test 1</h2>
    <div class="contents">test 1 text</div>
</div>
<div class="toggle">
    <h2><a name="test1"></a>Test 2</h2>
    <div class="contents">test 2 text</div>
</div>
<div class="toggle">
    <h3><a name="test1"></a>Test 3</h3>
    <div class="contents">test
3
text</div>
</div>
<div class="toggle">
    <h4><a name="test1"></a>Test 4</h4>
    <div class="contents"></div>
</div>
<div class="toggle">
    <h4><a name="test1"></a>Test 5</h4>
    <div class="contents">test 5 text</div>
</div>

测试1
测试1文本
测试2
测试2文本
测试3
测试
3.
文本
测试4
测试5
测试5文本
我尝试使用:

$text = preg_replace('#<h(\d+)>(.*?)</h\1>(.*)#si', '<div class="ToggleContents"><h$1>$2</h$1><div class="contents">$3</div></div>', $text);
$text=preg#u replace('#(.*)(.*)#si','$2$3',$text);
但问题是,它太贪婪了,我还没有弄明白如何让它变得不灵活和有效。有人有什么想法吗?

$text='测试1测试1文本
$text = '<h2><a name="test1"></a>Test 1</h2> test 1 text
<h2><a name="test2"></a>Test 2</h2> test 2 text
<h3><a name="test3"></a>Test 3</h3> test 3 text
<h4><a name="test4"></a>Test 4</h4> test 4 text
<h4><a name="test5"></a>Test 5</h4> test 5 text';

$text = preg_replace('#<h([1|2|3|4|5|6])>(.*?)</h([1|2|3|4|5|6])>\ (.*?)(\n|$)#si', '
<div class="toggle">
  <h\\1>\\2</h\\1>
  <div class="contents">\\4</div>
</div>
', $text);
测试2测试2文本 测试3测试3文本 测试4测试4文本 测试5测试5文本'; $text=preg#u replace('#(.*?)\(.*?)(.*?)(\n|$)#si',' \\2 \\4 “,$text); 或
解决方案:

$text = '<h2><a name="test1"></a>Test 1</h2><span>test 1 text</span>
<h2><a name="test2"></a>Test 2</h2><span>test 2 text</span>
<h3><a name="test3"></a>Test 3</h3><span>test 3 text</span>
<h4><a name="test4"></a>Test 4</h4><span>test 4 text</span>
<h4><a name="test5"></a>Test 5</h4><span>test 5 text</span>';

$text = preg_replace('#<h([1|2|3|4|5|6])>(.*?)</h([1|2|3|4|5|6])><span>(.*?)</span>#si', '
<div class="toggle">
  <h\\1>\\2</h\\1>
  <div class="contents">\\4</div>
</div>
', $text);
$text='测试1测试1文本
测试2测试2文本
测试3测试3文本
测试4测试4文本
测试5测试5文本';
$text=preg#u replace('#(.*)(.*)(.*)#si','
\\2
\\4
“,$text);

将其拆分为三种不同的搜索和替换操作

我明白了。。。我只是在所有标题后面加上了####################我

$page['HTML'] = preg_replace('#(<h(\d+)>)#i', '#####$1', $page['HTML']);
$page['HTML'] = preg_replace(
        '#<h(\d+)>(.*?)</h\1>(.*?)(\#{5}|$)#si',
        '<div class="ToggleContents"><h$1>$2</h$1><div class="contents">$3</div></div>',
        $page['HTML']);
$page['HTML'] = preg_replace(
        '#<div class="ToggleContents"><h(\d+)>(.*?)</h\1><div class="contents">([<br\s/>]*?)</div></div>#i',
        '<h$1>$2</h$1>$3',
        $page['HTML']);
$page['HTML'] = str_ireplace('#####', '', $page['HTML']);
$page['HTML']=preg_replace('#()#i','####$1',$page['HTML']);
$page['HTML']=preg_replace(
“#(.*)(.*)(.*)(\#{5}$)#si”,
'$2$3',
$page['HTML']);
$page['HTML']=preg_replace(
“#(.*)([]*?)#i”,
'$2$3',
$page['HTML']);
$page['HTML']=str_-ireplace(''.'HTML'.'',''.$page['HTML']);

为什么不使用正则表达式而不是正则表达式?例如,您可以修改Test 1test 1文本吗?谢谢。。。几乎有效。。。我用不同的$text格式更新了我的问题。我现在如何让它工作?提供的代码是否会更新?或者它需要这样解析?文本有各种不同的格式。。。有时没有换行符,有时有换行符。再次更新。请注意,文本4没有任何内容。基本上,点运算符将一直搜索到下一个\n。我需要点运算符搜索到下一个标记。代码必须按原样解析。它必须寻找到下一个或$2它是否需要作为pref_替换?或者一个preg_匹配替换可以工作吗?