Добрый день! Есть записи вот такого формата: milo-33-2-P-s rudn-6-4-P-s mz-8v-5-P-new-s2 ahm-5-9-P-s ob-28a-P-new-s mish-1`4-4-P-s mish-1`40-4-P-s grig-41-1-P-s budsh-9`40-4-p-s rad-26-1-p-s gs-15b-2-P-new-s2 ob-45`28-2-P-s3 grig-39a-2-P-s mm-27b-2-P-new-s нужно составить рег. вырвжение что бы $aOne= только milo rudn mz ahm ob mish grig (я так понимаю это [a-z]{1,5}) - только все что сначала до черточки, а второе $aTwo= все остальное -33-2-P-s -6-4-P-s -8v-5-P-new-s2 -5-9-P-s -1`40-4-P-s За ранее благодарин
PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'); $m ="milo-33-2-P-s rudn-6-4-P-s mz-8v-5-P-new-s2 ahm-5-9-P-s ob-28a-P-new-s mish-1`4-4-P-s mish-1`40-4-P-s grig-41-1-P-s budsh-9`40-4-p-s rad-26-1-p-s gs-15b-2-P-new-s2 ob-45`28-2-P-s3 grig-39a-2-P-s mm-27b-2-P-new-s"; $poisk='/(-.+?(?:s|2|3))/si'; preg_match_all($poisk,$m,$matches); echo $matches[1][0]; echo $matches[1][1]; echo $matches[1][2]; echo $matches[1][3]; echo $matches[1][4]; echo $matches[1][5]; echo $matches[1][6]; // и т.д ?>
PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'); $m ="milo-33-2-P-s rudn-6-4-P-s mz-8v-5-P-new-s2 ahm-5-9-P-s ob-28a-P-new-s mish-1`4-4-P-s mish-1`40-4-P-s grig-41-1-P-s budsh-9`40-4-p-s rad-26-1-p-s gs-15b-2-P-new-s2 ob-45`28-2-P-s3 grig-39a-2-P-s mm-27b-2-P-new-s"; $poisk='/(?<![-ne])([a-z]{2,7})/si'; preg_match_all($poisk,$m,$matches); echo $matches[1][0]; echo '<br>'; echo $matches[1][1]; echo '<br>'; echo $matches[1][2]; echo '<br>'; echo $matches[1][3]; echo '<br>'; echo $matches[1][4]; echo '<br>'; echo $matches[1][5]; echo '<br>'; echo $matches[1][6]; // и т.д ?>
Это вообще не то так как записей более 1000. To Dima4321-- Не понимаю как работают твои $poisk='/(?<![-ne])([a-z]{2,7})/si'; // рег. выражения. Но сам метод тоже не подойдет. Мне нужно на автомате много записей обработать,.. Осталось только $aOne= только milo rudn mz ahm ob mish grig (я так понимаю это [a-z]{1,5}) - только все что сначала до черточки, а второе или как его сделать??
Вот такое выражение работает ("[^-\S][a-z]{1,}[^-]{1}") но не берет первую запись((( тоесть выводит rudn mz ahm ob mish grig, а самую первую "milo" не хочет, блин хелп!
#^([^-]+)(.+)$#m - выражение работает но одно дает возможность брать по три записи из каждой: 1 : milo-33-2-P-s 1.1 : milo 1.2 : -33-2-P-s .......и т далее. но я использую Код (Text): $list = join($char); //print ($list); $char1 = preg_split("/-\S+-*-*-*/", $list, -1, PREG_SPLIT_NO_EMPTY); $char2 = preg_split("#^([^-]+)(.+)$#m", $list); а не preg_match где можно указать что-то типа Код (Text): $char2 = preg_match("#^([^-]+)(.+)$#m", $list, $reg) а потом использовать $reg[1] - для вывода именно второй записи ("1.1 : milo")(((( по этому и не подходит но спасибо за ответ.
А как сделать выражение "не символ" мне нужно выражение типо "(не "-")[a-z]{2,5}(исключить любые символы в любом количестве)"
А еще забыл сказать передаеться не через "\n"(новая строчка) список а в строчку, вот так Код (Text): ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s rudn-6-4-P-s mz-8v-5-P-new-s2 ahm-5-9-P-s ob-28a-6-P-new-s mish-1`4-4-P-s grig-41-1-P-s budsh-9`40-4-p-s rad-26-1-p-s gs-15b-2-P-new-s2 ob-45`28-2-P-s3 grig-39a-2-P-s mm-27b-2-P-new-s gd-63-2-P-s вот работает но не берет самое первое выражение: Код (Text): "[a-z]{1,}[^-]{1}" //выдает Всего совпадений 22 1 : bl 2 : gd 3 : mm 4 : hsh 5 : mish 6 : gs 7 : ob 8 : lysk 9 : milo 10 : rudn 11 : mz 12 : ahm 13 : ob 14 : mish 15 : grig 16 : budsh 17 : rad 18 : gs 19 : ob 20 : grig 21 : mm 22 : gd всего 22 из 23 выражений
вообще всю эту штуку можно разбить с помощью explode по пробелу, а затем каждую запись по дефису. и будет тебе щастье
Ведь так и сделал вот : Код (Text): $list = join($char); print ($list); $char1 = preg_split("/-\S+-*-*-*/", $list, -1, PREG_SPLIT_NO_EMPTY); $char2 = preg_split("/[^-\S][a-z]{1,}[^-]{1}/", $list); вот join делает по пробелу (10 записей): Код (Text): ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s а теперь разбиваю на две части одна берет только бувы в начале: 1. тут все как нужно Код (Text): $char1 = preg_split("/-\S+-*-*-*/", $list, -1, PREG_SPLIT_NO_EMPTY); // выводит Array ( [0] => ob [1] => bl [2] => gd [3] => mm [4] => hsh [5] => mish [6] => gs [7] => ob [8] => lysk [9] => milo ) 2. Должна выводить все остальное кроме первых букв, но... Код (Text): $char2 = preg_split("/[^-\S][a-z]{1,}[^-]{1}/", $list); Array ( [0] => ob-28b-1-P-new-s2 [1] => -82-1-p-s [2] => -47-1-P-new-s [3] => -11b-5-P-new-s [4] => -21`6-4-P-s [5] => -11-1-P-s [6] => -46a-1-P-new-s2 [7] => -5a-2-P-new-s3 [8] => -8`24-3-p-s [9] => -33-2-P-s ) тут обрати внимание на первую запись!!! И как это побороть ... капец вообщем. НИД ХЭЛП!
Panter7777 по-мойму ты зря ринулся сразу в регулярки. Это всё можно сделать более простым способом: PHP: <?php $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s'; $matches = explode(' ', preg_replace('#\s+#s', ' ', $text)); for($i = 0; $i < count($matches); $i++){ $matches[$i] = explode('-', $matches[$i]); } echo '<pre>'.print_r($matches, true).'</pre>'; ?> upd. хотя с помощью регулярки выглядит лучше PHP: <?php $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s'; preg_match_all('#[a-z]+(-[^ ]+)(?:\s|$)#sUi', $text, $matches); echo '<pre>'.print_r($matches, true).'</pre>'; ?>
Ну ... как сказать... ты разбил все по символам и загнал все в массив, но потом как мне вытягивать то что нужно если поля массива разные: Код (Text): Array ( [0] => Array ( [0] => ob [1] => 28b [2] => 1 [3] => P [4] => new [5] => s2 ) [1] => Array ( [0] => bl [1] => 82 [2] => 1 [3] => p [4] => s ) [2] => Array ( [0] => gd [1] => 47 [2] => 1 [3] => P [4] => new [5] => s ) Напимер нулевой и первый сравнить там 5 состовляющих, а во 1-м 4. А ведь записей будет более 1000 [/code]
PHP: <?php $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s'; preg_match_all('#[a-z]+(-[^ ]+)(?:\s|$)#sUi', $text, $matches); echo '<pre>'.print_r($matches[1], true).'</pre>'; ?> ?
супер!!! Код (Text): Array ( [0] => Array ( [0] => ob-28b-1-P-new-s2 [1] => bl-82-1-p-s [2] => gd-47-1-P-new-s [3] => mm-11b-5-P-new-s [4] => hsh-21`6-4-P-s [5] => mish-11-1-P-s [6] => gs-46a-1-P-new-s2 [7] => ob-5a-2-P-new-s3 [8] => lysk-8`24-3-p-s [9] => milo-33-2-P-s ) [1] => Array ( [0] => -28b-1-P-new-s2 [1] => -82-1-p-s [2] => -47-1-P-new-s [3] => -11b-5-P-new-s [4] => -21`6-4-P-s [5] => -11-1-P-s [6] => -46a-1-P-new-s2 [7] => -5a-2-P-new-s3 [8] => -8`24-3-p-s [9] => -33-2-P-s ) ) а вот точно так же только, чтоб один массив был начало (название) а второй все остальное!!!: Код (Text): Array ( [0] => Array ( [0] => ob [1] => bl [2] => gd [3] => mm [4] => hsh [5] => mish [6] => gs [7] => ob [8] => lysk [9] => milo ) [1] => Array ( [0] => -28b-1-P-new-s2 [1] => -82-1-p-s [2] => -47-1-P-new-s [3] => -11b-5-P-new-s [4] => -21`6-4-P-s [5] => -11-1-P-s [6] => -46a-1-P-new-s2 [7] => -5a-2-P-new-s3 [8] => -8`24-3-p-s [9] => -33-2-P-s ) ) вот можешь помочь сделать?
PHP: <?php $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s'; $matches = explode(' ', preg_replace('#\s+#s', ' ', $text)); $result = array(); for($i = 0; $i < count($matches); $i++){ if($matches[$i] == '') continue; $temp = explode('-', $matches[$i], 2); $result[] = '-'.$temp[1]; } echo '<pre>'.print_r($result, true).'</pre>'; ?> используя простой explode
PHP: <?php $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s'; preg_match_all('#([a-z]+)(-[^ ]+)(?:\s|$)#sUi', $text, $matches); echo '<pre>'.print_r($matches[1], true).'</pre>'; echo '<pre>'.print_r($matches[2], true).'</pre>'; ?>
Странный момент, если я даю иммено в таком виде: Код (Text): $text = 'ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s'; то работает, а если в таком через <textarea>списком: Код (Text): $street = $_POST['street']; function AddToArray($data) { for ($i=0; $i<count($data); $i++){ $char = explode("\n", $data); } $list = join($char); print ($list); AddToArray ($street); причем print($list); вот Код (Text): ob-28b-1-P-new-s2 bl-82-1-p-s gd-47-1-P-new-s mm-11b-5-P-new-s hsh-21`6-4-P-s mish-11-1-P-s gs-46a-1-P-new-s2 ob-5a-2-P-new-s3 lysk-8`24-3-p-s milo-33-2-P-s и в коде Код (Text): preg_match_all('#([a-z]+)(-[^ ]+)(?:\s|$)#sUi', $text, $matches); $text меняю на $list, то не работает!!!!
Вот тебе на автомат ! Лови )) Код (Text): <?php ini_set('display_errors',1); error_reporting(E_ALL); setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'); $m ="milo-33-2-P-s rudn-6-4-P-s mz-8v-5-P-new-s2 ahm-5-9-P-s ob-28a-P-new-s mish-1`4-4-P-s mish-1`40-4-P-s grig-41-1-P-s budsh-9`40-4-p-s rad-26-1-p-s gs-15b-2-P-new-s2 ob-45`28-2-P-s3 grig-39a-2-P-s mm-27b-2-P-new-s"; $poisk='/(?<![-ne])([a-z]{2,7})/si'; // (?<![-ne])-позиционная проверка. Чтобы не захватывало слово new $keywords = preg_split("/[\s]+/", $m ); $count=count($keywords); $new=preg_match_all($poisk,$m,$matches); $i=0; while($i<$count) // { echo $matches[1][$i]; echo "<br>"; $i++; } ?>
это уже вопрос не по регулярным выражениями. разбирайся сам. воспользуйся командой echo '<pre>'.print_r($list, true).'</pre>';