Php 预更换和'|';(或)不在我的正则表达式中工作
我有一个像这样的字符串:Php 预更换和'|';(或)不在我的正则表达式中工作,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个像这样的字符串: [propertyname]=[value] "height"='max' propertyname和值都可以用单引号或双引号进行封装 所以我可以收到一个字符串,如下所示: [propertyname]=[value] "height"='max' 或: 只要属性名称和值都由相同类型的引号封装 我需要做的是删除引号。但仅限于属性名称和值!因为以下内容也可能是有效字符串: "blaat"="Some 'random' blaat" 最终结果应该是: blaat=
[propertyname]=[value]
"height"='max'
propertyname
和值都可以用单引号或双引号进行封装
所以我可以收到一个字符串,如下所示:
[propertyname]=[value]
"height"='max'
或:
只要属性名称
和值
都由相同类型的引号封装
我需要做的是删除引号。但仅限于属性名称
和值
!因为以下内容也可能是有效字符串:
"blaat"="Some 'random' blaat"
最终结果应该是:
blaat=Some 'random' blaat
我有下面的正则表达式,它可以工作。但它只在我检查双引号或单引号时起作用。当我尝试将它们与|
操作符组合时,它就不再起作用了
<?php
$string = '"height"=\'something "else" in here\'';
//echo preg_replace ( '#"(.*?)"#', '$1', $string );
//echo preg_replace ( '#\'(.*?)\'#', '$1', $string );
echo preg_replace ( '#("(.*?)"|\'(.*?)\')#', '$1', $string );
?>
因此,我可以简单地执行两个preg\u replace
调用,但考虑到regex应该能够在一个调用中处理这个问题,这是一个令人讨厌的工作
知道问题是什么吗?您的正则表达式应该正确匹配,但您有一个问题:在“组合正则表达式”中,$1
指的是整个匹配(因为第一组括号包含整个匹配),所以您要用匹配本身替换匹配,包括引号
("(.*?)"|\'(.*?)\')
^ ^ ^
|-+--- $1 |---- $3
|--- $2
现在,您只需删除外圆括号:
"(.*?)"|\'(.*?)\'
^ ^
|--- $1 |---- $2
但是,您有一个不同的问题:您需要将匹配项替换为$1
或$2
,这取决于正则表达式的哪一半匹配。既然你不能事先知道,那就不容易了。您可以尝试用$1$2
替换,但我不知道PHP是否允许对未参加比赛的组进行反向引用
为了更好地安全起见,请使用可以同时处理这两种情况的正则表达式,包括引号字符串中的转义引号:
$result = preg_replace(
'/( # Match and capture (group 1):
["\'] # an opening quote character
) # (End of group 1).
( # Now match and capture (group 2):
(?: # Either...
\\\\. # an escaped character
| # or...
(?!\1) # (as long as it is not the closing quote)
. # any other character.
)* # Repeat as needed.
) # (End of group 2)
\1 # Now match the closing quote./x',
'\2', $subject);
您的正则表达式应该正确匹配,但您有一个问题:在“组合正则表达式”中,$1
指的是整个匹配项(因为第一组括号括住了整个匹配项),因此您要将匹配项替换为自身,包括引号
("(.*?)"|\'(.*?)\')
^ ^ ^
|-+--- $1 |---- $3
|--- $2
现在,您只需删除外圆括号:
"(.*?)"|\'(.*?)\'
^ ^
|--- $1 |---- $2
但是,您有一个不同的问题:您需要将匹配项替换为$1
或$2
,这取决于正则表达式的哪一半匹配。既然你不能事先知道,那就不容易了。您可以尝试用$1$2
替换,但我不知道PHP是否允许对未参加比赛的组进行反向引用
为了更好地安全起见,请使用可以同时处理这两种情况的正则表达式,包括引号字符串中的转义引号:
$result = preg_replace(
'/( # Match and capture (group 1):
["\'] # an opening quote character
) # (End of group 1).
( # Now match and capture (group 2):
(?: # Either...
\\\\. # an escaped character
| # or...
(?!\1) # (as long as it is not the closing quote)
. # any other character.
)* # Repeat as needed.
) # (End of group 2)
\1 # Now match the closing quote./x',
'\2', $subject);
使用类[“]”]
捕获两个引号,或使用非捕获组(?:)
避免由于括号内的原因而产生额外的捕获组:
'#"(.*?)"#'
// or
'#(?:"(.*?)"|\'(.*?)\')#'
使用类[“]”]
捕获两个引号,或使用非捕获组(?:)
避免由于括号内的原因而产生额外的捕获组:
'#"(.*?)"#'
// or
'#(?:"(.*?)"|\'(.*?)\')#'
只需使用字符类而不是“#[”](.*?[”]#
。只需使用字符类而不是“#[”](.*?[”]#
。非常感谢伟大的正则表达式:)非常感谢伟大的正则表达式:)