PHP preg_match_all:如果整行包含模式,如何排除它们?

PHP preg_match_all:如果整行包含模式,如何排除它们?,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我正试图找出如何用分号分隔所有行,如果它们不包含冒号,以便进一步的正则表达式工作。现在我正在使用一个变通方法,因为所有不包含分号或冒号的行也包含一个括号“(”。因此,我只是忽略任何包含括号的行。我的代码实际上不起作用: <?php $filename = "fakexample.txt"; $file = fopen($filename, "rb"); $myFile = fread($file, filesize($filename)); function get_lines($str

我正试图找出如何用分号分隔所有行,如果它们不包含冒号,以便进一步的正则表达式工作。现在我正在使用一个变通方法,因为所有不包含分号或冒号的行也包含一个括号“(”。因此,我只是忽略任何包含括号的行。我的代码实际上不起作用:

<?php
$filename = "fakexample.txt";
$file = fopen($filename, "rb");
$myFile = fread($file, filesize($filename));

function get_lines($string, $myFile){
  preg_match_all("/$string/m", $myFile, $matches);
  return $matches;
}

$string = "^((?!:|\().)*$";
$list = get_lines($string, $myFile);

foreach($list[1] as $list){
  echo $list."\n";
}
?>

(?这可能会起作用:


其他: 下面是上述正则表达式的分解,它满足问题中所述的精确原始要求:即“…如果不包含冒号,则用分号分隔所有行…”

$re='/#匹配行;但不匹配:
^#锚定至线路起点。
[^;:\r\n]*#零个或多个非:,非-;
##匹配一个;(最低要求)。
[^:\r\n]*#零个或更多非-:。
$#锚定到线路末端。
/xm′;
但是,既然您坚持使用表达式:
“^((?!(:\())*$”
,那么您真正想要匹配的似乎是:“没有冒号和左括号的行。”(这就是该表达式所做的)。(您可能已经理解了它,但我总是喜欢编写带有完整注释的表达式-我自己也无能为力!)因此,这里对其进行了分解:

$re='/#匹配不带冒号或左括号的行。
^#锚定至线路起点。
(#一次通过一个字符的行。
(?!#断言此字符不是。。。
(:|\()#冒号或左括号。
)#结束消极前瞻。
.#可以安全地匹配下一个非换行字符。
)*#一次通过一个字符的行。
$#锚定到线路末端。
/xm′;
如果这是您真正想要的,那么很好。但如果是这种情况,则上述表达式可以大大简化(并加快)为:

$re='/#匹配不带冒号或左括号的行。
^#锚定至线路起点。
[^:(\r\n]*#零个或多个非:,非(,非下线。
$#锚定到线路末端。
/xm′;
为了完整起见,如果你真正真正需要的是匹配“至少有一个分号,但没有冒号或左括号”的行,那么这一行可以做到:

$re='/#匹配行;但不匹配:或(
^#锚定至线路起点。
[^;:(\r\n]*#零个或多个非:,非-,非-(。
##匹配一个;(最低要求)。
[^:(\r\n]*#零个或多个非:,非(。
$#锚定到线路末端。
/xm′;
当使用正则表达式时,在问题的前面精确地定义需求是非常重要的。正则表达式是一种非常精确的语言,它们只会做要求它们做的事情


我希望这会有帮助!

你在它周围放了斜杠吗?Ruby不支持lookbehind(即
(?如果你想在多行模式下运行这个正则表达式(即在正则表达式的末尾,最后一个斜杠之后放一个
m
)然后,这个正则表达式应该能够识别出由分号分隔的所有内容,而不是没有分号的行:
(?是的,数组索引0表示匹配的所有内容。数组索引1(如果存在)将表示匹配第一个括号中的子模式的所有内容。在最后一个斜杠后的正则表达式末尾添加
m
,以启用多行模式,这一点也很重要。那么,您到底想要什么?逗号、冒号、分号?我是李ttle这里有点混乱。是否要筛选这些行,以便只有带分号但不带冒号的行?拆分这些行,迭代它们并筛选
表格:
大小写(
preg\u grep()
)然后再进行拆分。@Mario,我正在做的事情如下:。我不确定我有多接近。仍在排除语法错误。@Mario,仍在进行语法错误的排除。@Ridgerunner,你的图标有问题。你能解释一下正则表达式吗,ridge?非常接近。最后一行分号分隔的值由这段代码,但前三行分号分隔的值不是。因此,缺少的部分:
父亲、主人、族长、佩蒂斯塔、封锁、皮拉尔、豺狼的肚子、杰斯特。
捕获的部分:
键;可见;开明的
哦,嘿。我们找到了。将
$string
中的正则表达式切换到
^((?!(:\())*$
。我遇到的问题不是正则表达式本身。而是周围用于打印所有内容的PHP。不过,我想更好地理解正则表达式。我正在反复阅读手册,试图记住它。谢谢,兄弟。给你
金绿色潜水战斗翼
。因此,基本上,我接受结果d在分号上做一个
preg_split()
,以便排列?是的,最好仔细思考你想问的问题,然后仔细地说出来,这样就不会有歧义(不要中途改变它!-人们会花时间回答你的问题)。使其具体化,并提供示例输入和所需输出。听起来好像您真正想要的是解析逗号/分号分隔值(CSV)。如果是这样,请搜索“解析CSV”(这会被问到很多问题)。我有另一个答案,您可能想看看,它显示了您面临的问题。请参阅:。
vulture (wing)
tabulations: one leg; two legs; flying
father; master; patriarch    
mat (box)
pedistal; blockade; pilar
animal belly (oval)
old style: naval
jackal's belly; jester
slope of hill (arch)
key; visible; enlightened