2016-01-11 6 views
2

У меня есть строка, которая содержит один или несколько целых чисел, разделенных пробелом, например:Отображение целых чисел в строке с preg_replace

$string = '2 7 6 9 11'; 

Я хочу, чтобы заменить каждое число с соответствующим словом, которое хранится в массив, например:

static $companyTypes = array('word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7', 'word8', 'word9', 'word10', 'word11', 'word12'); 

Так я использовал пример, который я нашел на этой странице: http://php.net/manual/en/function.preg-replace.php

и я определил массив шаблон вроде этого:

$pattern = array('/1/','/2/','/3/','/4/','/5/','/6/','/7/','/8/','/9/','/10/','/11/','/12/'); 

и, наконец, используется функция preg_replace как это:

$order->company_type= preg_replace($pattern, $companyTypes, $order->company_type); 

, но, к сожалению, это решение не будет различать между числами с одной цифрой и чисел с двумя цифрами, так что, если входной строки «1 11» выход будет «word1 word1word1», а не «word1 word11».

Любая помощь будет оценена по достоинству.

+1

Используйте границы слов '\ b':'/\ b1 \ b/','/\ b2 \ b/'и так далее. – HamZa

ответ

1

Решение, которое является полностью регулярным выражением:

$pattern = array('/(^1 | 1 | 1$)/', '/(^2 | 2 | 2$)/', '/(^3 | 3 | 3$)/', '/(^4 | 4 | 4$)/', '/(^5 | 5 | 5$)/' , '/(^6 | 6 | 6$)/', '/(^7 | 7 | 7$)/', '/(^8 | 8 | 8$)/', '/(^9 | 9 | 9$)/', '/(^10 | 10 | 10$)/', '/(^11 | 11 | 11$)/', '/(^12 | 12 | 12$)/', '/(^13 | 13 | 13$)/', '/(^14 | 14 | 14$)/'); 
echo preg_replace($pattern, $companyTypes, $string); 

Что /(^5 | 5 | 5$)/ означает, что если строка существа с 5 с последующим пробелом, или, если мы сопоставляем строку, которая имеет «5», или если мы сопоставляем строку, которая находится в конце строки, и ей предшествует пробел, после чего она будет соответствовать. Он будет соответствовать '5 ' (в начале строки), ' 5 ' (любой, где посередине), или ' 5' (в конце строки).

Если один из типов компании соответствует чему-то в регулярном выражении, у вас могут возникнуть проблемы, которые вы изначально описали. Поэтому я предоставил другое решение, если оно вам действительно нужно.

Другим решением, которое разбивает строку на части:

Регулярное выражение может быть обновлена ​​только заменить на точное совпадение.

$pattern = array('/^1$/','/^2$/','/^3$/','/^4$/','/^5$/','/^6$/','/^7$/','/^8$/','/^9$/','/^10$/','/^11$/','/^12$/','/^13$/','/^14$/'); 

Так, в примере /^10$/, то ^ указывает на начало строки и $ указывает конец строки. В целом это означает, что это означает, что есть точное соответствие 10.

И вы должны действительно разделить свой старт, чтобы предотвратить любые нежелательные изменения строки. Итак, используйте explode, чтобы разделить свою строку, затем перебрать каждую часть строки и заменить нужные части, а затем вернуть строку вместе с implode.

$string = '2 7 6 9 11'; 
$string_parts = explode(' ', $string); 

$pattern = array('/^1$/','/^2$/','/^3$/','/^4$/','/^5$/','/^6$/','/^7$/','/^8$/','/^9$/','/^10$/','/^11$/','/^12$/','/^13$/','/^14$/'); 

$result = []; 
foreach ($string_parts as $string_part) { 
    $result[] = preg_replace($pattern, $companyTypes, $string_part); 
} 
$order->company_type = implode(' ', $result); 
+0

Спасибо, ваше детальное решение работало отлично. – Amin

Смежные вопросы