PHP正则表达式跳过第一个匹配

PHP正则表达式跳过第一个匹配,php,regex,Php,Regex,我有以下资料: <h5> MY DATA </h5> » Test data1 » Test data2 » Test data3 我的数据 »测试数据1 »测试数据2 »测试数据3 我希望匹配除第一个之外的所有“»”。但是我尝试过的各种正则表达式都不起作用。请提供一些解决方案 谢谢你可以试试这个: $result = preg_replace('~[^>\s]\h*\R\K(?=»)~', '<br/>', $string); 模式的目标是在字符

我有以下资料:

<h5> MY DATA </h5>
» Test data1
» Test data2
» Test data3
我的数据
»测试数据1
»测试数据2
»测试数据3
我希望匹配除第一个之外的所有“»”。但是我尝试过的各种正则表达式都不起作用。请提供一些解决方案

谢谢你可以试试这个:

$result = preg_replace('~[^>\s]\h*\R\K(?=»)~', '<br/>', $string);
模式的目标是在字符串中的正确位置匹配空字符串。

您可以尝试以下方法:

$result = preg_replace('~[^>\s]\h*\R\K(?=»)~', '<br/>', $string);
模式的目标是在字符串中的正确位置匹配空字符串。

您可以尝试以下方法:

$result = preg_replace('~[^>\s]\h*\R\K(?=»)~', '<br/>', $string);
模式的目标是在字符串中的正确位置匹配空字符串。

您可以尝试以下方法:

$result = preg_replace('~[^>\s]\h*\R\K(?=»)~', '<br/>', $string);
模式的目标是在字符串中的正确位置匹配空字符串。

但是为什么要匹配除第一个之外的所有
>
?如果你告诉我们你想完成什么,而不是如何完成,你会得到更好的回答

据我所知,您有一个由两行或更多行组成的块,这些行以某个字符开头,您希望在每行末尾添加一个

标记,最后一行除外。当你这样描述它时,正则表达式实际上是这样写的:

^        # beginning of line (in multiline mode)
(».+\R)  # `»` and the rest of the line, including the trailing newline (`\R`)
(?=»)    # lookahead checks that the next line begins with `»`, too
该行在组#1中捕获,因此我们将其插回替换字符串并添加

标记:

$result = preg_replace('/^(».+\R)(?=»)/m', '$1<br/>', $subject);
$result=preg_replace('/^(».+\R)(?=»)/m','$1
',$subject);
我不擅长PHP,但您可能需要添加UTF8修饰符(
/^(».+\R)(?=»)/mu
),或者对
>
字符(
/^(\x{BB}.+\R)(?=\x{BB})/m
使用十六进制转义符(

),但为什么要匹配除第一个字符外的所有
?如果你告诉我们你想完成什么,而不是如何完成,你会得到更好的回答

据我所知,您有一个由两行或更多行组成的块,这些行以某个字符开头,您希望在每行末尾添加一个

标记,最后一行除外。当你这样描述它时,正则表达式实际上是这样写的:

^        # beginning of line (in multiline mode)
(».+\R)  # `»` and the rest of the line, including the trailing newline (`\R`)
(?=»)    # lookahead checks that the next line begins with `»`, too
该行在组#1中捕获,因此我们将其插回替换字符串并添加

标记:

$result = preg_replace('/^(».+\R)(?=»)/m', '$1<br/>', $subject);
$result=preg_replace('/^(».+\R)(?=»)/m','$1
',$subject);
我不擅长PHP,但您可能需要添加UTF8修饰符(
/^(».+\R)(?=»)/mu
),或者对
>
字符(
/^(\x{BB}.+\R)(?=\x{BB})/m
使用十六进制转义符(

),但为什么要匹配除第一个字符外的所有
?如果你告诉我们你想完成什么,而不是如何完成,你会得到更好的回答

据我所知,您有一个由两行或更多行组成的块,这些行以某个字符开头,您希望在每行末尾添加一个

标记,最后一行除外。当你这样描述它时,正则表达式实际上是这样写的:

^        # beginning of line (in multiline mode)
(».+\R)  # `»` and the rest of the line, including the trailing newline (`\R`)
(?=»)    # lookahead checks that the next line begins with `»`, too
该行在组#1中捕获,因此我们将其插回替换字符串并添加

标记:

$result = preg_replace('/^(».+\R)(?=»)/m', '$1<br/>', $subject);
$result=preg_replace('/^(».+\R)(?=»)/m','$1
',$subject);
我不擅长PHP,但您可能需要添加UTF8修饰符(
/^(».+\R)(?=»)/mu
),或者对
>
字符(
/^(\x{BB}.+\R)(?=\x{BB})/m
使用十六进制转义符(

),但为什么要匹配除第一个字符外的所有
?如果你告诉我们你想完成什么,而不是如何完成,你会得到更好的回答

据我所知,您有一个由两行或更多行组成的块,这些行以某个字符开头,您希望在每行末尾添加一个

标记,最后一行除外。当你这样描述它时,正则表达式实际上是这样写的:

^        # beginning of line (in multiline mode)
(».+\R)  # `»` and the rest of the line, including the trailing newline (`\R`)
(?=»)    # lookahead checks that the next line begins with `»`, too
该行在组#1中捕获,因此我们将其插回替换字符串并添加

标记:

$result = preg_replace('/^(».+\R)(?=»)/m', '$1<br/>', $subject);
$result=preg_replace('/^(».+\R)(?=»)/m','$1
',$subject);

我不擅长PHP,但您可能需要添加UTF8修饰符(
/^(».+\R)(?=»)/mu
),或者对
>
字符(
/^(\x{BB}.+\R)(?=\x{BB})/m
)使用十六进制转义符。

你好,谢谢您的回复。但这是一个变通办法——因为它首先找到第一个匹配项和位置,然后删除所有内容,然后将第一个位置中的内容放回。我想知道在一个正则表达式中是否有什么东西可以解决这个问题。另一个答案是完全正则表达式(页面上的第二篇帖子)
但是我尝试过的各种正则表达式都不起作用
那么请告诉我们您尝试了什么以及失败的原因。同样请注意,如果在
»测试数据1
»测试数据2
之间有另一条像
foobar
这样的随机线,该怎么办。它是否匹配?嗨,哈姆扎,谢谢回复。不,该行将不匹配。只有符号。先跳过。我试过(?:^»)(.*)(»),?!^.)(»),…etcHi Pendo,感谢您的回复。但这是一个变通办法——因为它首先找到第一个匹配项和位置,然后删除所有内容,然后将第一个位置中的内容放回。我想知道在一个正则表达式中是否有什么东西可以解决这个问题。另一个答案是完全正则表达式(页面上的第二篇帖子)
但是我尝试过的各种正则表达式都不起作用
那么请告诉我们您尝试了什么以及失败的原因。同样请注意,如果在
»测试数据1
»测试数据2
之间有另一条像
foobar
这样的随机线,该怎么办。它是否匹配?嗨,哈姆扎,谢谢回复。不,该行将不匹配。只有符号。先跳过。我试过(?:^»)(.*)(»),?!^.)(»),…etcHi Pendo,感谢您的回复。但这是一个解决办法——因为它首先找到第一个匹配项和位置,然后删除所有内容