[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с регулярными выражениями
idimka39
Мне необходимо отделить русские слова от англиских.

Строки могут выглядеть вот так:

В этом примере англ. и русские слова разделены " " (может быть неск. пробелов)
1.string1-string2_string3 строка1 строка2_строка3
(кол-во тире и подчеркиваний может быть любым, могут быть цифры)

англ. и русские слова разделены " - " (может быть неск. пробелов)
2.string1-string2_string3 - строка1 строка2_строка3
(кол-во тире и подчеркиваний может быть любым, могут быть цифры)

англ. и русские слова разделены "-"
3.string1-string2_string3-строка1 строка2_строка3
(кол-во тире и подчеркиваний может быть любым, могут быть цифры)

Уже все голову сломал, ничего не выходит.
Что на данный момент имею:


<?php

for ($i=0;$i<3;$i++){
$file = array ("r_az-del1 раз-дел1","razd-e-l1 - раз дел2","r-azd_e_l1-раздел3");

//заменяю " - " на "|" с помощью регулярок, а то вдруг будет неск. пробелов.
$file = preg_replace ("#\s+-\s+#",'|',$file[$i]);

$razdel1 = rtrim(preg_replace ("#([0-9a-zA-z\s_-]*)(\s|\||-)*([0-9а-яА-Я\s_-]*)#",'\1',$file),'-_ ');
$razdel2 = rtrim(preg_replace ("#([0-9a-zA-z\s_-]*)(\s|\||-)*([0-9а-яА-Я\s_-]*)#",'\3',$file),'-_ ');

echo $razdel1."<br>";
echo $razdel2."<br>";
}
?>


Итог:


r_az-del1 �<br>
раздел1<br>
razd-e-l1�<br>
раздел2<br>
r-azd_e_l1-�<br>
раздел3<br>


Вконце англ. слова не должно быть ни тире, ни пробела, ни нарушений кодировки(?).



Спустя 4 часа, 21 минута, 21 секунда (16.02.2012 - 07:32) #8bit написал(а):
незнаю пойдет так или нет

$file = array ("r_az-del1 раз-дел1","razd-e-l1 - раз дел2","r-azd_e_l1-раздел3");
for ($i=0; $i<3; $i++)
{
preg_match('#(?:\s|^)([^а-яё\s]*)(?(?=(?:-[а-яё]*)-|(?:$|\s)))#iu', $file[$i], $razdel1);
preg_match('#(?<=[^а-яё0-9a-z])([^a-z]*)(?:$|\s)#iu', $file[$i], $razdel2);

$arr1[] = $razdel1[1];
$arr2[] = $razdel2[1];
}

echo '<pre>';
var_dump($arr1);
echo '</pre><br>';
echo '<pre>';
var_dump($arr2);
echo '</pre>';


Спустя 7 минут, 32 секунды (16.02.2012 - 07:39) #8bit написал(а):
preg_match('#(?:\s|^)([^а-яё\s]*)(?(?=(?:-[а-яё]*)-|(?:$|\s)))#iu', $file[$i], $razdel1);
preg_match('#(?<=[^а-яё0-9a-z])(?=[а-яё])([^a-z]*)(?:$|\s)#iu', $file[$i], $razdel2);

или вот, немного корректней

Спустя 53 минуты, 59 секунд (16.02.2012 - 08:33) idimka39 написал(а):
спасибо большое, все работает! буду думать над вашим примером, чтобы повысить свой уровень.

метасимвол "u" я так понимаю, убрал проблемы с кодировкой?
А почему была использована функция preg_match? В preg_replace также можно сделать или будет хуже в плане производительности?

Спустя 1 час, 2 минуты, 58 секунд (16.02.2012 - 09:36) nugle написал(а):
Match ищет соответствия replace заменяет найденные строки на новыеие
Быстрый ответ:

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