Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 正则表达式或_Php_Regex - Fatal编程技术网

Php 正则表达式或

Php 正则表达式或,php,regex,Php,Regex,嗨,我厌倦了在PHP中使用正则表达式。以下是我喜欢的元素: <a="300"> <a="300"b="300"> <b="300"> 问题是我只得到 <a="300"> <b="300"> 使用以下正则表达式: <(a|b)="[0-9]*"> 我必须改变什么,才能得到这三个元素?是否有AND或运算符?您需要一个额外的分组,以指定您将接受该类型的多个: echo '<a="300"> <a

嗨,我厌倦了在PHP中使用正则表达式。以下是我喜欢的元素:

<a="300">
<a="300"b="300">
<b="300">

问题是我只得到

<a="300">
<b="300">

使用以下正则表达式:

<(a|b)="[0-9]*">


我必须改变什么,才能得到这三个元素?是否有AND或运算符?

您需要一个额外的分组,以指定您将接受该类型的多个:

echo '<a="300">
<a="300"b="300">
<b="300">' | egrep '<((a|b)="[0-9]*")+>'
<a="300">
<a="300"b="300">
<b="300">
echo'
“白鹭”

正则表达式不是布尔逻辑。正则表达式中的
|
符号不是OR运算符;它被称为交替,其工作原理类似,但并不完全相同。如果只是尝试匹配多个字符中的一个,则应使用方括号
[]
创建字符集。在这种情况下,
[ab]
匹配
a
b
,就像
[0-9]
匹配
0
1
2
等一样

这是我建议的模式


假设您的问题是一个简单的字符串处理而不是严重的解析,我会修改您的正则表达式如下:

<(a|b)="[0-9]+".*>
  • 带有
    |
    的管道单字符较不受
    […]
  • \d
    用于数字系列
  • [^>]*?
    用于非

您确定这是有效的php吗?不,这只是grep-E或sed以及我所知道的许多其他语言中的有效正则表达式。但是因为在这个例子中,使用了几乎相同的元素,()和*,而我使用()和+。+是否需要掩蔽,或者您关心什么?CAustin也使用+。我想我担心的只是php代码问题没有在php中得到回答,我知道正则表达式与语言无关,但OP要求的是php解决方案。不要用正则表达式解析XML或HTML,使用一个。为什么不呢?是否存在安全或性能问题?是的,我想你可以说存在性能问题,因为这是不可能的。你可以把它混在一两个标签上,但是用正则表达式解析完整的文档永远不会以一种正常的方式发生。那么
(a | b)
[ab]
的区别是什么呢?我们为什么要使用方括号呢?这是一个成本低得多的操作,需要大约一半的逻辑步骤来解决。它更简洁,因为它不需要在进程拆分的每个选项之间插入字符。支持范围,因此如果要匹配a、b、c或d,可以编写
[a-d]
,而不是
(a | b | c | d)
。它也不会创建一个[可能不需要的]捕获组,通过交替使用,必须通过使用
(?:)
而不是仅使用
()
来避免该捕获组。如果我想找到宽度和高度,该怎么办?我能把这些也放在括号里吗?@ThiKool我不知道你说的是什么意思。如果你说的是在a和b之外匹配x和y,是的,这是可能的。你可以在这里测试@ThiKool no,
(?:width | length)
是一个非常好的正则表达式,可以匹配任意一个单词。使用字符组(
[]
)并不能代替替换。是的,因果关系的例子缺少一些可靠的答案,为什么在“现实世界”中使用
[ab]
而不是
(?:a | b)
<[ab]="\d+"[^>]*?>