2012-08-14 41 views
0


我很难分开文本。
这是情景:
PHP如何分割文本中具有相同分隔符的文本?

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

通过爆炸,我可以的话有独立的假设“|”,而是因为我检索到的值“动物|狗”应该是一个单词所以在这种情况下, ,解决方案是什么?我也无法使用 限制,因为文本的位置或数量可能不同。

明确区分文本的唯一方法是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"
谢谢。

+0

您能向我们展示您希望输出看起来如何吗?你希望每个项目都是独立的或更复杂的东西? – 2012-08-14 03:23:38

+0

我想提取出“Animal | Dog”并更改为“Animal:Dog”或最终输出应该是“Apple | Orange | Animal:Dog | Grape” – Eric 2012-08-14 03:28:49

+0

您只想更改这一个字符串或给定的任何一般字符串要提取的部分? – 2012-08-14 03:34:44

回答

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寻找所有以文本“Animal”开头的子字符串$check,后跟一个冒号,然后是一串带有一个或多个字符的单词,并以管道结束。这将查找类别名称以及字符串中该类别的第一个成员。第二个参数":$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" 

让我知道这是很难跟随!

+0

感谢亚历克斯它确实解决了这个问题。 你介意我问,如果我想提取整个动物|狗|猫,如果在某些情况下,它可能是'动物|狗|猫' – Eric 2012-08-14 03:57:54

+0

你的意思是如果你想改变''动物|狗|猫'到''动物|狗:猫'?然后你会做'$ newCheck = str_replace(“Animal | Dog |”,“Animal | Dog:”);'而不是。查看[PHP文档](http://php.net/manual/en/function.str-replace.php)。 – 2012-08-14 04:02:35

+0

抱歉打错 可以说假如默认是“Animal:Dog | Cat”或者“Animal:Fish | Bird”,那么动物可能会有所不同 – Eric 2012-08-14 04:08:20

0

Apple和Orange之间有空格,像这样Apple |橙子。但动物和狗之间没有空间就像这个动物|狗。如果是这种情况,你可以爆炸像这样

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

将在格式

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

返回数组你可以操纵上述阵列再次获得动物

我希望这是什么你的意思是

编辑:粗略的解决办法是:

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

所以在这种情况下,动物和狗的位置并不重要

+0

对不起,在我的情况下没有空间。 – Eric 2012-08-14 03:23:31

+0

@Eric,你想要的输出是什么? – WatsMyName 2012-08-14 03:24:28

+0

我想提取出“Animal | Dog”并改为“Animal:Dog” – Eric 2012-08-14 03:29:07

0

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

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

,但如果你不想这样做......那么,如果你知道你的类别名称是什么样的“动物”,你可能会爆炸的阵列|并假设如果你的当前值是“动物”,那么数组中的下一个元素将是“狗”,“猫”,无论如何。这不是一个好的解决方案,但不适用于多个类别级别。

+0

哦,刚刚看到你的评论如上。最好的办法是爆炸阵列并分别处理元素。或者你可以尝试一个字符串替换,如果你知道你在找什么。你有多少种不同的类别? – Revent 2012-08-14 03:35:01

-1

str_replace(“Animal |”,“Animal:”,$ check); 然后做爆炸

相关问题