Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Parsing - Fatal编程技术网

Php 正则表达式来提取子字符串

Php 正则表达式来提取子字符串,php,regex,parsing,Php,Regex,Parsing,真的很挣扎…希望有人能让我找到正确的解决方法 我的输入字符串的结构如下: $string = '66-2141-A-AC107-7'; preg_match('/^(.*-){3}(.*)-(.*)/', $string, $matches); $special_id = $matches[2]; print $special_id; $str = '66-2141-A-AC107-7'; preg_match('/^(?:[^-]*-){3}([^-]+)/', $str, $matches

真的很挣扎…希望有人能让我找到正确的解决方法

我的输入字符串的结构如下:

$string = '66-2141-A-AC107-7';
preg_match('/^(.*-){3}(.*)-(.*)/', $string, $matches);
$special_id = $matches[2];
print $special_id;
$str = '66-2141-A-AC107-7';
preg_match('/^(?:[^-]*-){3}([^-]+)/', $str, $matches);
echo $matches[1];  // prints AC107
66-2141-A-AC107-7

我对使用单个正则表达式提取字符串“AC107”感兴趣。我知道如何使用其他PHP字符串函数实现这一点,但我必须使用正则表达式

我需要的是提取第三个和第四个连字符之间的所有数据。每个部分的结构不是固定的(即,66可能是8798709,2141可能是38)。保证有足够数量的连字符(即总有四(4)个连字符)


非常感谢您的帮助/指导

这应该查找任何后跟连字符3次的内容,然后在第2组(第二组括号)中,它将包含您的值,后跟另一个连字符和其他内容

/^(.*-){3}(.*)-(.*)/
您可以使用$2访问它。在php中,它是这样的:

$string = '66-2141-A-AC107-7';
preg_match('/^(.*-){3}(.*)-(.*)/', $string, $matches);
$special_id = $matches[2];
print $special_id;
$str = '66-2141-A-AC107-7';
preg_match('/^(?:[^-]*-){3}([^-]+)/', $str, $matches);
echo $matches[1];  // prints AC107

这将满足您的需要:

(?:[^-]*-){3}([^-]+)

说明:

  • (?:[^-]*-)
    查找零个或多个后跟连字符的非连字符
  • {3}
    查找刚才描述的三个块
  • ([^-]+)
    从该点向前捕获所有连续的非连字符(将在下一个连字符之前自动切断)
您可以在PHP中使用它,如下所示:

$string = '66-2141-A-AC107-7';
preg_match('/^(.*-){3}(.*)-(.*)/', $string, $matches);
$special_id = $matches[2];
print $special_id;
$str = '66-2141-A-AC107-7';
preg_match('/^(?:[^-]*-){3}([^-]+)/', $str, $matches);
echo $matches[1];  // prints AC107

哇!Ed Cottrell…超越一切!清晰、简洁、解释力强。非常感谢你的帮助!请记住接受答案。:)对于下一个投票人(我假设他就是刚才评论并删除评论的同一个人):从技术上讲,你是对的,
^
对于给定的示例来说是不必要的。为了清楚起见,我编辑了我的答案。不知道为什么有人会否决这个正确而有效的答案+1点星的使用非常差(且不必要)。请注意:
/^(.*)-{3}(.*)-(.*)/
在字符串中包含超过4个连字符时失败。请参阅:@Ed Cottrell的答案,了解制作此正则表达式的更好方法。如果你打算提供更多关于正则表达式相关问题的答案,你最好去阅读。谢谢你的链接,ridgerunner。我看看能不能买到那本书。我喜欢使用正则表达式,我一直在寻找提高这方面技能的方法-我保证你不会后悔的。MRE3是我读过的最有用的书。请注意,在我开始使用正则表达式之前,我已经专业编程了30多年(低级汇编、C、FORTRAN等)。一旦我发现了它们(并阅读了MRE3),就再也没有回头路了(我因为没能更快地学习它们而痛斥自己1000次)。现在没有他们我活不下去了!正则表达式现在是我的(文本处理/编辑)工具箱中最强大的(是的,也是最有趣的)工具。我所了解到的关于REGEX的一切都是零零碎碎的。我没有人教我这些东西,所以我花了很长时间才习惯使用它们。我的雇主有一个Safari在线帐户,所以我正在我们谈话时获取这本书。再次感谢。。。我期待着有一天成为一名REGEX大师-瑞克