Php 此reg表达式有问题
我对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表达式,但似乎如果产品名称少于
#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等开头时,我才需要获取产品名称,如果字符串以其他数字开头,我不需要获取产品名称。谢谢