首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP正则表达式将每个空行后的第一行替换为第二行

PHP正则表达式将每个空行后的第一行替换为第二行
EN

Stack Overflow用户
提问于 2016-09-15 16:54:21
回答 3查看 115关注 0票数 1

是否可以使用PHP preg_replace获取每一行的值并将其替换为下一行的值?例如:

代码语言:javascript
运行
复制
id "text 1"
str ""

id "text 2"
str ""

id "text 6"
id_p "text 6-2"
str[0] ""
str[1] ""

结果:

代码语言:javascript
运行
复制
id "text 1"
str "text 1"

id "text 2"
str "text 2"

id "text 6"
id_p "text 6-2"
str[0] "text 6"
str[1] "text 6-2"

我使用正则表达式,但我不能这样做,而且我不确定这是否可能,或者不仅仅是使用正则表达式。

任何帮助或指导我们都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-15 17:02:43

将捕获idid_p中的值的块与this regex进行匹配

代码语言:javascript
运行
复制
'~^id\h+"(.*)"(?:\Rid_p\h+"(.*)")?(?:\Rstr(?:\[\d])?\h*"")+$~m'

将这些块传递给preg_replace_callback回调方法,并将str ""str[1] ""替换为第一个捕获组值,将str[1] ""替换为第二个捕获组值。

使用

代码语言:javascript
运行
复制
$re = '~^id\h+"(.*)"(?:\Rid_p\h+"(.*)")?(?:\Rstr(?:\[\d])?\h*"")+$~m'; 
$str = "id \"text 1\"\nstr \"\"\n\nid \"text 2\"\nstr \"\"\n\nid \"text 3\"\nstr \"\"\n\nid \"text 4\"\nstr \"\"\n\nid \"text 5\"\nstr \"\"\n\nid \"text 6\"\nid_p \"text 6-2\"\nstr[0] \"\"\nstr[1] \"\""; 
$result = preg_replace_callback($re, function($m){
    $loc = $m[0];
    if (isset($m[2])) {
        $loc = str_replace('str[1] ""','str[1] "' . $m[2] . '"', $loc);
    }
    return preg_replace('~^(str(?:\[0])?\h+)""~m', "$1\"$m[1]\"",$loc);
}, $str);

echo $result;

请参阅this PHP demo

票数 1
EN

Stack Overflow用户

发布于 2016-09-15 17:32:51

既然结构总是一样的,为什么还要费心使用正则表达式呢?一个简单的循环就可以做到这一点:

代码语言:javascript
运行
复制
$ar[] = 'id "text 1"';
$ar[] = 'str ""';
$ar[] = '';
$ar[] = 'id "text 2"';
$ar[] = 'str ""';
$ar[] = '';

for($i=0;$i<count($ar);$i++){
    if($i%3 == 0){
        $ar[($i+1)] = $ar[$i];
    }
}

print_r($ar);
// Array ( [0] => id "text 1" [1] => id "text 1" [2] => [3] => id "text 2" [4] => id "text 2" [5] => ) 
票数 0
EN

Stack Overflow用户

发布于 2016-09-15 18:03:39

您可以尝试下面的regExp。也许这会有所帮助:

代码语言:javascript
运行
复制
<?php

    $string = 'id "text 1"\nstr ""\n\nid "text 2"\nstr ""';
    $rx     = "#([\"'])*([^'\"]*?)([\"'])*(\n\s*?\n*?)(str\s)([\"'])*([^'\"]*?)([\"'])*#si";

    $res = preg_replace($rx, "$1$2$3$4$5$6$2$6", $string);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39506852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档