[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разбор строки
Palych
Задача следующая: через параметр передается строка, содержащая одну или несколько структур вида XXXX-XXXX, где X - это цифра или буква A..F (т.е. это аналог VolumeID). Структуры могут быть разделены чем угодно, кроме цифр и букв A..F (скорее всего запятой или пробелом или запятой и пробелом, но юзверь может и еще чего-нить ввести в форму). Нужно, отбросив все лишнее, получить в массиве такие структуры для дальнейших манипуляций. Т.е. все левые символы заменить пробелами, выкинуть лишние пробелы (оставить по одному в качестве разделителя) и последующий explode, как-то так? Но и если подстрока не соответствует структуре, ее нужно прибить.
Видимо, копать нужно в сторону регулярных выражений, но мне как паскалисту сложно сразу в них вникнуть. Может, на моем примере легче будет разобраться.
Заодно посоветуйте, плиз, как правильно отфильтровать вводимые юзверем данные, чтобы меня через мой скрипт не "нагнули". smile.gif



Спустя 59 минут, 13 секунд (18.02.2010 - 15:26) baston написал(а):
Может быть, такое выражение:
(^[A-F0-9]{4})[^A-F\d]([A-F0-9]{4}$)

Спустя 1 час, 28 секунд (18.02.2010 - 16:27) Palych написал(а):
Не понял, в середине отрицание символов?
Я, наверное, не очень понятно написал. Разделитель не в центре, а в конце структуры, в центре д.б. "-".
Есть строка:
1234-ABCD 1A2B-3C4D 9999-FFFF
Вместо пробелов м.б. что угодно, в начале и конце строк тоже, нужно получить:
1234-ABCD
1A2B-3C4D
9999-FFFF

Спустя 6 минут, 55 секунд (18.02.2010 - 16:34) DedMorozzz написал(а):
preg_replace("/[^A-Z0-9-]+$/","\r\n",$str); 
как-то так наверное

Спустя 6 минут (18.02.2010 - 16:40) baston написал(а):
([0-9A-F]{4})
Но, может быть захвачены и символы, похожие на искомые, в самом тексте, если попадутся.

Спустя 25 минут, 35 секунд (18.02.2010 - 17:05) Palych написал(а):
2 DedMorozzz
Не сработало. sad.gif

2 baston
А чуть подробнее код плз...

Спустя 2 минуты, 13 секунд (18.02.2010 - 17:07) DedMorozzz написал(а):
мм...не сработало? Что выдало и откуда берёшь строку? Алгоритм передльно прост - пропускаються символы A-Z0-9 и дефис, а остальные заменяються на перевод строки. Что там могло не сработать.

Спустя 6 минут, 1 секунда (18.02.2010 - 17:13) DedMorozzz написал(а):
А, блин, сотри "$". Итого выглядеть должно так:
preg_replace("/[^A-Z0-9-]+/","\r\n",$str); 

Иль вместо "\r\n\" - "<br>".

Спустя 2 минуты, 57 секунд (18.02.2010 - 17:16) Palych написал(а):
В адресной строке ввожу:
www.mysite.com/myscript.php?str=1234-1234,1111-2222%20%203333-4444
В скрипте:
...
$str = strtoupper($_GET['str']);
$str = preg_replace("/[^A-Z0-9-]+$/","\r\n",$str);
echo $str;
...

Выводит:
1234-1234,1111-2222 3333-4444
С <br> аналогично.

Спустя 5 секунд (18.02.2010 - 17:16) Mizka написал(а):

$str = '1234-ABCD 1A2B-3C4D 9999-FFFF';
$outputArray = explode(" ", $str);
echo $outputArray[0]; // 1234-ABCD

Спустя 4 минуты, 2 секунды (18.02.2010 - 17:20) DedMorozzz написал(а):
Внимательно прочти мой последний пост(особенно про доллар). Там всё написано! Работает точно. У себя проверил

Спустя 1 минута, 54 секунды (18.02.2010 - 17:22) Mizka написал(а):
Цитата

1234-ABCD 1A2B-3C4D 9999-FFFF
Вместо пробелов м.б. что угодно, в начале и конце строк тоже, нужно получить:
1234-ABCD
1A2B-3C4D
9999-FFFF

что хотел, то и получил...

Спустя 31 секунда (18.02.2010 - 17:23) Palych написал(а):
Mizka
Если бы только пробелы там были, да. Но что юзверь введет в поле - хз. Важно сделать так, чтобы можно было выцепить по возможности все структуры, хоть юзверь введет через пробел, хоть через запятую и пробел, хоть через точку с запятой, и загнать всю эту байду в массив.

Спустя 1 минута, 48 секунд (18.02.2010 - 17:25) DedMorozzz написал(а):
<?php
$aaa= "1234-1234,1111-2222%20%203333-4444";
echo preg_replace("/[^A-Z0-9-]+/","<br>",$aaa);
?>

Вот что вывело:
1234-1234
1111-2222
20
203333-4444

Спустя 1 минута, 3 секунды (18.02.2010 - 17:26) Palych написал(а):
DedMorozzz
Обратил внимание только на <br>, а про доллар не дочитал. Без бакса заработало, респект и большое СПАСИБО!!! smile.gif

Спустя 6 дней, 20 часов, 45 минут, 30 секунд (25.02.2010 - 14:11) Palych написал(а):
И все-таки я не совсем доволен результатом - это решение не проверяет число символов в структуре и чтобы '-' был именно посередине. Думал, дальше сам разберусь, но что-то не выходит. Хотелось бы, чтобы из строки на входе:
$s = "1234-5678,1A2B-3C4D ABCD-EF90, 123, ABC-DEF00";

получался массив:
a[0]=1234-5678 
a[1]=1A2B-3C4D
a[2]=ABCD-EF90

Спустя 1 час, 18 минут, 56 секунд (25.02.2010 - 15:30) Palych написал(а):
Так вроде работает:
preg_match_all("/[A-F0-9]{4}[-][A-F0-9]{4}+/",$s,$aa,PREG_PATTERN_ORDER);
$a = $aa[0];
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.