Php str_替换问题(字母和数字)
我想用字母替换数字:Php str_替换问题(字母和数字),php,string,replace,str-replace,Php,String,Replace,Str Replace,我想用字母替换数字: <?php $text = 'I have 10 apples'; $numbers = array(0, 1, 2,..., 10); $letters = array('zero', 'one', 'two',... 'ten'); echo str_replace($numbers, $letters, $text); // output is 'I have onezero apples' instead of 'I have ten apples' ?&g
<?php
$text = 'I have 10 apples';
$numbers = array(0, 1, 2,..., 10);
$letters = array('zero', 'one', 'two',... 'ten');
echo str_replace($numbers, $letters, $text);
// output is 'I have onezero apples' instead of 'I have ten apples'
?>
如何生成正确的输出?它不仅适用于数字,也适用于单词(在$number
数组中也可以是字母/单词)
但是,如果在进行替换之前添加了更多需要使用if语句或类似语句进行比较的值,则这不是长期解决方案。问题是,它首先将
1
替换为1
,然后将0
替换为0
正如建议的那样,你可以颠倒顺序,这样它将首先寻找更高的数字,但正如所说,这可能是一条漫长的道路
请勾选此问题:
或者,尝试预匹配
或者让PHP反转数组:
$numbers = array_reverse(array(0, 1, 2,..., 10));
$letters = array_reverse(array('zero', 'one', 'two',... 'ten'));
您只需按键长降序对数组排序,它将同时对数字和其他字符串进行排序。以下代码应适用于您:
<?php
$text = 'I have 10 (or 21) apples and I would like to bake an apple pie';
$numbers = array(0, 1, 2, 10, 21, ' a ', ' an ');
$letters = array('zero', 'one', 'two','ten','twenty one',' A ',' AN ');
$data = array_combine($numbers, $letters);
krsort($data, SORT_STRING);
echo str_replace(array_keys($data), array_values($data), $text);
// Output: I have ten (or twenty one) apples and I would like to bake AN apple pie
?>
使用相同的方法将为您提供:
嗨,一,再见,二,你好,二十一
按预期输出
它是如何工作的-解释
使用array\u combine()
函数可以创建一个新数组,其中包含$numbers
数组中的键和$letters
中的值。仅当输入数据位于两个单独的数组中时,才使用此函数。如果在开头使用了关联数组:$data[0]=>“zero”$数据[1]=>“一”代码>此函数将是不必要的
现在,由于某些键可能包含其他键,因此需要对数据进行排序,使最长的键优先于较短的键。它使10
变为10
,而不是1 0
。您可以使用krsort()
函数,使用用于比较的键对数组进行排序(使用array\u combine,我们的键现在是$numbers
数组中的数据),使用SORT\u字符串
比较,以相反顺序排序,因此如果我们有单词c、a、ccc和cc
,它将以相反的顺序排序(正常的另一个是a,c,cc,ccc
),因此它们将是ccc,cc,c,a
最后在排序之后,我们需要将数据传递给str\u replace
。这个函数需要键和值,我们没有将它们分开,因为之前我们使用array\u combine()
创建了一个数组并对其进行排序。但是现在我们可以使用array\u keys()
和array\u values()从该数组中获取键和值
函数。如果您只需要正数,下面的答案最好使用数组反转,如果您需要包含负数,则需要更多的条件检查问题不仅仅是数字,甚至可能是要替换的单词,即:我这里有两个单词“Anh”和“Anha”,我会将“Anh”替换为“Hello”“Anha”和“Hi”。我认为使用preg_替换为特定规则会更好。如何用图像替换单词,如果我有一个大致相似的单词数组,我正在寻找替换特定单词的方法,即:“an”将替换为“Hi”,而“Anh”将替换为“Hello”,而“Anha”将替换为“Bye”@AbuRayane你检查过这个代码了吗?它应该可以工作。对于Anha 2 Anh 21
它会给你输出:Hi one Bye two Hello 21
这是代码吗$text='An 1 Anha 2 Anh 21';$numbers=array(0,1,2,10,21,'a','An','An','An','An','Anh','Anha');$letters=array('0'、'1'、'2'、'10'、'21'、'A'、'AN'、'Hi'、'Hello'、'Bye');echo str_替换($number、$letters、$text)
@AbuRayane是的,我编辑了我的答案并添加了第二个示例。我没有看到任何情况它不起作用。是吗?你测试过吗?@AbuRayane你测试过全部代码吗?看看我的答案。我在stru替换中没有使用$numbers
和$letters
。再次-仔细看看我的答案。我已经添加了完整的代码来编辑我的答案万一你误解了。
<?php
$text = 'I have 10 (or 21) apples and I would like to bake an apple pie';
$numbers = array(0, 1, 2, 10, 21, ' a ', ' an ');
$letters = array('zero', 'one', 'two','ten','twenty one',' A ',' AN ');
$data = array_combine($numbers, $letters);
krsort($data, SORT_STRING);
echo str_replace(array_keys($data), array_values($data), $text);
// Output: I have ten (or twenty one) apples and I would like to bake AN apple pie
?>
$text = 'An 1 Anha 2 Anh 21';
$numbers = array(0, 1, 2, 10, 21, ' a ', ' an ', 'An','Anh', 'Anha');
$letters = array('zero', 'one', 'two','ten','twenty one',' A ',' AN ', 'Hi', 'Hello', 'Bye');
$data = array_combine($numbers, $letters);
krsort($data, SORT_STRING);
echo str_replace(array_keys($data), array_values($data), $text);