【问题标题】:Php string explode string based on characters match with string condition基于字符匹配字符串条件的php字符串爆炸字符串
【发布时间】:2018-08-05 19:10:41
【问题描述】:

我有这样的字符串:

$string1 = '35 Hose & Couplings/350902 GARDEN HOSE COUPLING, PVC, 16\/19 MM"';

$string2 = '35 Hose & Couplings/350904 GARDEN HOSE TAP CONNECTOR, PVC, 3\/4" FEMALE THREAD"';

我尝试将字符串分开并变成这样的数组:

$name1 = explode('/', $string1);
$name1 = trim(end($name1));
$name2 = explode('/', $string2);
$name2 = trim(end($name2));

/*
 #results
 $name1[0] = '35 Hose & Couplings';
 $name1[1] = '350902 GARDEN HOSE COUPLING, PVC, 16\';
 $name1[2] = '19 MM"';
 ...
 #expected results
 $name1[0] = '35 Hose & Couplings';
 $name1[1] = '350902 GARDEN HOSE COUPLING, PVC, 16\/19 MM"';
 ...
*/

我想在只有/的时候爆炸字符串,但是当它遇到\/不应该爆炸字符串,我的代码仍然爆炸如果字符串包含\/,有没有办法做到这一点?

【问题讨论】:

  • '我想在只有'/'的时候炸掉字符串,但是遇到'/'就不会炸掉字符串'--什么意思?
  • @IsThisJavascript 是的,这就是我想要的
  • 我认为这是正则表达式的工作,不幸的是我的正则表达式技能很烂。也许您可以尝试在这里寻求进一步的帮助,直到有人可以提供更好的指导regexr.com
  • 你要么首先“保护”异常“\\/”,方法是用一些“神奇”序列替换它,然后在替换剩余的“/”出现后将其转换回来,或者你使用常规带有前瞻的表达式。

标签: php arrays regex explode


【解决方案1】:

你可以这样:

$string1 = str_replace("\/","@",$string1);
$name1 = explode('/', $string1);
foreach($name1 as $id => $name) {
    $name1[$id] = str_replace("@","\/",$name1[$id]);
}

有点麻烦,我知道,但应该可以解决问题。将其包装在一个函数中以获得更好的可读性。

基本上我用临时字符串替换了您不想爆炸的字符串,并在爆炸后将其恢复。

【讨论】:

  • 然后使用其他东西,比如# 或其他。代码总是需要根据项目进行调整。
  • 你说得对,我从问题中复制了那个代码片段。我现在删除了它。
  • @MichałSkrzypek 它打印 350902 GARDEN HOSE COUPLING, PVC, 16@19 MM" @ 正在替换 \/ ,如果我想使用 @
  • 是的,上面有建议,我建议使用“#”或任何您不需要的符号。 foreach 循环应该将 @ 恢复为 \/。
  • 虽然我相信正则表达式是前进的方向;您还可以使用多个您永远不会按顺序使用的符号。 @#]! 例如...
【解决方案2】:

您可以使用带有否定后视功能的正则表达式:

$parts = preg_split('~(?<!\\\\)/~', $string1);

查看eval.in上的示例

【讨论】:

  • 我喜欢这个解决方案。它完成了这项工作,正则表达式看起来像一条鱼。
  • 如果您在答案中提供现场演示会很好。
  • @revo,据我所知,SO 在答案中没有实时 PHP 演示的可能性——就像 JavaScript 一样。但我添加了一个链接。
  • 谢谢,我也不是这个意思。
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多