我已经做了一段时间没有成功。所以我在寻求帮助。
我有什么:
我有一系列我正在寻找的各种模式,所以我可以替换它们。阵列中的所有其他项目都没有问题。这些替换字符串中只有一个做了我以前从未见过的事情。
字符串是:
width_(\d+\w+)=width: $1;
当通过爆炸在等号上分开时:
$a = explode( '=', $replacement_string );
这变为:
$a[0] = "width(\d+\w+)";
和
$a[1] = "width: $1;";
然后针对传入的字符串对其进行测试。
$a = preg_replace( "/$a[0]/i", "$a[1]", $incoming_string );
现在"我不知道为什么会这样做"部分。如果传入的字符串是
"width_100px"
我回来了
"width: 100px;"
但是如果传入的字符串是
"width_100%"
我回来了
"width: 100;%"
奇怪的是 - 如果我刚刚回来
"width: 100;"
我能理解。 "%"与分号(;)匹配。但这会将分号置于和百分号。只是他们被逆转了。我甚至试图查看是否有百分号并将其更改为
"width_100\%"
但这并没有改变它的结果。
我也尝试过" %%"而不只是一个"%"。
仍然出现width: 100;%
任何帮助表示感谢。
ANSWERED:
这个难题的答案是" \ w"正则表达式的一部分 NOT 匹配百分号(%),因为\ w只是[a-zA-Z0-9_](如下面的Uby所示。因为所有这些字符串都被分解了为了分离请求,width_100%本身就是通过改变它所寻找的东西(\ d +(。*))(根据Chris85的建议) - 这就抓住了数字(在这种情况下为100) )以及百分号因此允许我将其转换为"宽度:100%;"。
感谢Chris和Uby的帮助。
答案 0 :(得分:1)
您的正则表达式为\d+\w+
,其中不包含char %
百分比。因此,替换只会忽略它,只用width_100
替换width: 100;
。
尝试将(\d+\w+)
替换为(\d+[a-zA-Z0-9_%]+)
答案 1 :(得分:1)
您可以在此处查看当前的问题:https://regex101.com/r/xD9rG3/1
%
未匹配,因此保留。您可以告诉正则表达式使用此表达式查找%
或px
。
width_(\d+(?:px|%))
功能演示:
$replacement_string = 'width_(\d+(?:px|%|em))=width: $1;';
$a = explode( '=', $replacement_string );
//$a[0] = "width(\d+\w+)";
//$a[1] = "width: $1;";
$incoming_string = 'width_100%';
$a = preg_replace( "/$a[0]/", "$a[1]", $incoming_string);
echo $a;
正则表达式101演示:https://regex101.com/r/xD9rG3/2
另外,您应该注意\w
包含下划线,因此您的其他正则表达式可能会失败。如果您只想查找字母字符,请使用[a-zA-Z]+
或添加\d
,如果您想要包含数字。
您可以使用的另一个正则表达式,我不建议使用:
width_(\d+.*)
这表示找width_
任意数量的数字,然后是其他每个字符。这可能会为您生成无效的CSS。这会匹配您的whatever the part is after the number
请求但是