【问题标题】:PHP how to split text that have same delimiter in the text?PHP如何拆分文本中具有相同分隔符的文本?
【发布时间】:2012-08-10 07:57:48
【问题描述】:


我无法分隔文本。
这是场景:

$check = "Apple|Orange|Animal|Dog|Grape";

假设通过使用explode,我可以用“|”分隔单词,但是因为我检索到的值“Animal|Dog”应该是一个单词,所以在这种情况下,解决方案是什么?我无法使用 也有限制,因为文本的位置或数量可能不同。

区分文本的唯一方法是 Animal 关键字。 php中有没有类似mysql LIKE语法的函数?

如果情况 2

$check = "Apple|Orange|Animal:Dog|Cat|Grape";
OR
$check = "Apple|Orange|Animal:Fish|Bird|Grape";

动物的名字可能会有所不同。
输出
"Apple|Orange|Animal:Dog,Cat|Grape" or "Apple|Orange|Animal:Fish,Bird|Grape"
谢谢。

【问题讨论】:

  • 你能告诉我们你希望输出的样子吗?您希望这些项目中的每一个都是独立的还是更复杂的?
  • 我想提取“Animal|Dog”并更改为“Animal:Dog”或者最终输出应该是“Apple|Orange|Animal:Dog|Grape”
  • 您只想更改这个字符串或给定要提取的部分的任何通用字符串?
  • 仅来自 Animal 的特定字符串|对动物:。例如:动物|猫|香蕉|橙色 = 动物:猫|香蕉|橙色

标签: php split explode delimiter


【解决方案1】:

如果您只想替换“Animal|”用“动物:”然后你可以做一个简单的str_replace

$check = "Apple|Orange|Animal|Dog|Grape";
$newCheck = str_replace("Animal|","Animal:"); // will be set to 'Apple|Orange|Animal:Dog|Grape'

这是你的意思吗?

编辑,案例 2:

我假设您有一个类似"Apple|Orange|Animal:Dog|Cat|Grape" 的字符串,它的类别后跟该类别的 2 个成员。根据您所说,您希望将此字符串转换为"Apple|Orange|Animal:Dog,Cat|Grape",并用逗号而不是管道分隔两个组成员。这比第一种情况更复杂 - 类别名称可能会有所不同,并且您不能执行以冒号开头的简单 str_replace,因为该组的第一个成员也可能会有所不同。对于这种情况,您需要使用正则表达式来匹配和替换字符串的模式。代码如下:

$check = "Apple|Orange|Animal:Dog|Cat|Grape";
$newCheck = preg_replace("#(Animal:\w+)\|#", "$1,", $check); // will be set to "Apple|Orange|Animal:Dog,Cat|Grape"

DEMO

如果您不熟悉正则表达式,让我解释一下它的作用。 preg_replace 函数的第一个参数 "#(Animal:\w+)\|#" 告诉 PHP 查找 $check 的所有子字符串,这些子字符串以文本“Animal”开头,后跟一个冒号,然后是包含一个或多个字符的单词字符串,以及以管道结束。这将在您的字符串中查找类别名称以及该类别的第一个成员。第二个参数":$1," 告诉PHP 将此模式之后的第一个管道更改为逗号。如果您有不同的类别名称,只需更改作为第一个参数传递给 preg_replace 函数的模式:

$check = "Apple|Orange|Animal1:Fish|Bird|Grape";
$newCheck = preg_replace("#(Animal1:\w+)\|#", "$1,", $check); // will be set to "Apple|Orange|Animal1:Fish,Bird|Grape"

如果这很难理解,请告诉我!

【讨论】:

  • 感谢 Alex,它确实解决了这个问题。你介意我问一下,如果我想提取整个 Animal|Dog|Cat 怎么办,如果在某些情况下它可能是“Animal|Dog|Cat”
  • 您的意思是如果您想将'Animal|Dog|Cat' 更改为'Animal|Dog:Cat'?然后你会做$newCheck = str_replace("Animal|Dog|","Animal|Dog:");。查看PHP documentation
  • 抱歉错字假设默认情况下是“动物:狗|猫”或“动物:鱼|鸟”,其中动物可能会有所不同。
  • 我仍然对你想要做什么感到困惑。您想从完整字符串中提取该部分吗?或者以某种方式改变它?
  • 很抱歉造成混乱,我已在顶部帖子中添加了案例 2。请看一看。
【解决方案2】:

Apple 和 orange 之间有空格,例如 Apple |橘子。但是 Animal 和 Dog 之间没有空格 Like this Animal|Dog。如果是这种情况,你可以这样爆

$check = "Apple | Orange | Animal|Dog | Grape";
$ex=explode(" | ", $check);

返回数组格式

array("Apple","Orange","Animal|Dog","Grape");

你可以再次操作上面的数组来得到Animal

我希望这就是你的意思

编辑:一个粗略的解决方案可能是:

<?
$check = "Apple|Orange|Animal|Dog|Grape";
$ex=explode("|",$check);
if(in_array("Animal",$ex))
{
    echo "Animal:";
}
if(in_array("Dog",$ex)){
    echo "Dog";
}
?>

所以在这种情况下,动物和狗的位置无关紧要

【讨论】:

  • 好吧,对不起,在我的情况下没有空间。
  • @Eric,你想要的输出是什么?
  • 我想提取“Animal|Dog”并更改为“Animal:Dog”
【解决方案3】:

str_replace("动物|","动物:",$check); 然后爆炸

【讨论】:

    【解决方案4】:

    我处理这个问题的方法是使用 / 而不是 |类别和项目之间。或者如果您真的想保留 |,请使用不同的分隔符在类别和项目之间。

    $check = "Apple|Orange|Animal/Dog|Grape";
    $ex=explode("|", $check);
    

    但是如果您不想这样做...那么如果您知道您的类别名称类似于“动物”,您可以在 | 上展开数组。并假设如果您当前的值是“动物”,那么数组中的下一个元素将是“狗”、“猫”等等。不过,这不是一个好的解决方案,并且不适用于多个类别级别。

    【讨论】:

    • 哦,刚刚看到你上面的评论。最好的办法可能是分解数组并分别处理元素。或者,如果您知道要查找的内容,则可以尝试使用字符串替换。您将拥有多少种不同的类别?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多