Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.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 此reg表达式有问题_Php_Regex - Fatal编程技术网

Php 此reg表达式有问题

Php 此reg表达式有问题,php,regex,Php,Regex,我对reg表达式有一个奇怪的问题 我想用这样的字符串写出产品的名称 #T55.08 #J60.91 #M1/1 #YT102/0///Tie #G #T55.08 #J60.91 #M1/1 #YT102/0///Foulard #G #T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief #G 我正在使用tx2re()创建reg表达式,但似乎如果产品名称少于

我对reg表达式有一个奇怪的问题

我想用这样的字符串写出产品的名称

#T55.08 #J60.91 #M1/1 #YT102/0///Tie                      #G
#T55.08 #J60.91 #M1/1 #YT102/0///Foulard                  #G
#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief      #G
我正在使用tx2re()创建reg表达式,但似乎如果产品名称少于4个字符,reg exp就无法工作。。。 你能帮帮我吗

这是我的正则表达式

/(#)(T)(55\\.08)( )(#)(J)(60\\.91)( )(#)(M)(1)(\\/1)( )(#)(YT)(102)(\\/0)(\\/)(\\/)(\\/)((?:[a-z][a-z]+))(.)((?:[a-z][a-z]+))/is

此表达式将捕获产品的名称:

/#RT55\.08 #J60\.91 #M1\/1 #YT102\/0\/\/\/(.*)#G/

我假设
#T55.08#J60.91#M1/1#YT102/0//
#G
永不改变。

此表达式将捕获您的产品名称:

/#RT55\.08 #J60\.91 #M1\/1 #YT102\/0\/\/\/(.*)#G/

我假设
#T55.08#J60.91#M1/1#YT102/0//
#G
永不改变。

如果您只想知道产品的名称,可以使用以下正则表达式:

.*?\/\/\/(.*?)#G

但是,如果字符串的初始部分(即,
//
之前的所有内容)是固定的,则只需使用子字符串即可。

如果只需要产品名称,则可以使用以下正则表达式:

.*?\/\/\/(.*?)#G

但是,如果字符串的初始部分(即
//
之前的所有内容)是固定的,则可以简单地使用子字符串。

这看起来确实太复杂了。如果您只需要产品名称,可以使用:

/\/\/\/(.*)#G$/
preg_match('~///(.+?)\s*#G$~', $string, $matches);

这看起来太复杂了。如果您只需要产品名称,可以使用:

/\/\/\/(.*)#G$/
preg_match('~///(.+?)\s*#G$~', $string, $matches);

此问题不需要使用正则表达式。如果第一段始终保持不变

$string = "#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief      #G";
$title = trim(substr($string, 33, -2));
或者如果它总是在
//
之后:

$title = trim(substr($string, strpos($string,'///')+3, -2));

此外,
substr
将比
preg\u match
preg\u replace
运行速度快得多。对于此问题,您不需要使用正则表达式。如果第一段始终保持不变

$string = "#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief      #G";
$title = trim(substr($string, 33, -2));
或者如果它总是在
//
之后:

$title = trim(substr($string, strpos($string,'///')+3, -2));

此外,
substr
的运行速度比
preg\u match
preg\u replace
快得多。在我看来,字符串的格式是给定的,行的每一端都有一个
,行内的字段由斜杠分隔

您大概知道,在该格式中,产品名称将始终位于同一字段位置

在这种情况下,您根本不需要使用正则表达式(当然也不需要像您提出的那样复杂得可怕!)。您只需切掉行首和行尾的
#
字符,用斜杠分解字符串,然后从生成的数组中选择适当的元素:

$inputrow = trim($inputrow,'#');
$fields = explode('/',$inputrow);
$product_name = trim($fields[5]);

在我看来,字符串的格式是给定的,行的每一端都有一个
#
,行内的字段由斜杠分隔

您大概知道,在该格式中,产品名称将始终位于同一字段位置

在这种情况下,您根本不需要使用正则表达式(当然也不需要像您提出的那样复杂得可怕!)。您只需切掉行首和行尾的
#
字符,用斜杠分解字符串,然后从生成的数组中选择适当的元素:

$inputrow = trim($inputrow,'#');
$fields = explode('/',$inputrow);
$product_name = trim($fields[5]);

如果产品名称的前缀始终为
//
,则可以使用:

/\/\/\/(.*)#G$/
preg_match('~///(.+?)\s*#G$~', $string, $matches);

如果产品名称的前缀始终为
//
,则产品名称将位于
$matches[1]
,您可以使用:

/\/\/\/(.*)#G$/
preg_match('~///(.+?)\s*#G$~', $string, $matches);

产品名称将在
$matches[1]

中。如果产品名称之前的文本始终是固定的字符数(就像在示例中显示的那样),则您只需要产品名称,不要使用regext。regex很混乱。字符串的哪一部分可以更改?如果你花时间做一些小事情,比如大写“I”和完整地写出单词,你可能会得到更多的响应。为什么在所有不重要/不变的元素周围都有括号?你不需要它们。你确定你的正则表达式发布正确吗?它根本不应该匹配,因为所有这些双反斜杠…如果产品名称之前的文本始终是固定数量的字符(就像在示例中显示的那样),那么您只需要产品名称,不要使用regext。regex是一团乱。字符串的哪一部分可以更改?如果你花时间做一些小事情,比如大写“I”和完整地写出单词,你可能会得到更多的响应。为什么在所有不重要/不变的元素周围都有括号?你不需要它们。你确定你的正则表达式发布正确吗?它不应该匹配,因为所有这些双反斜杠…我将用
(.*)\s*
替换
(.*)以跳过空白,但其他方面很好。谢谢,我还有许多其他字符串,如#T56.38#J80.60等,所以我甚至需要检查第一部分。所以这个解决方案是完美的@Matteo,仅供参考,此解决方案仅在字符串的第一部分从未更改的情况下有效,这与您刚才的评论相反。我有许多其他字符串要用正则表达式验证这一点,并且仅当字符串以#T55.08 J60.91等开头时,我才需要获取产品名称,如果字符串以其他数字开头,我不需要获取产品名称。谢谢我会用
(.*)\s*
替换
(.*)以跳过空白,但其他方面很好。谢谢,我还有许多其他字符串,如#T56.38#J80.60等,所以我甚至需要检查第一部分。所以这个解决方案是完美的@Matteo,仅供参考,此解决方案仅在字符串的第一部分从未更改的情况下有效,这与您刚才的评论相反。我有许多其他字符串要用正则表达式验证这一点,并且仅当字符串以#T55.08 J60.91等开头时,我才需要获取产品名称,如果字符串以其他数字开头,我不需要获取产品名称。谢谢