Проблемы с регулярными выражениями

vd

Новичок
Проблемы с регулярными выражениями

Имеется файл состоящий из блоков подобной структуры:

flag *I:
#
# Первое склонение: существительные ж.р., оканчивающиеся на -а
#
[^ГЖКХЧШЩ] А > -А,Ы # стена > стены (р.п.)
[ГЖКХЧШЩ] А > -А,И # киска > киски (р.п.)
А > -А,Е # стена > стене (д.п.)
А > -А,У # стена > стену (в.п.)
[^ЖЦЧШЩ] А > -А,ОЙ # стена > стеной (т.п.)
# устаревшая форма
[^ЖЦЧШЩ] А > -А,ОЮ # стена > стеною (т.п.)
# окончание в т.п. слов на [жцчшщ]а зависит от ударения, но преимущественно так:
[ЦЧШЩ] А > -А,ЕЙ # куча > кучей (т.п.)
# устаревшая форма
[ЦЧШЩ] А > -А,ЕЮ # куча > кучею (т.п.)
[^К] А > -А,- # стена > стен (мн,р.п.)
[^АЕЖИЙОУЦЧШЬЫЮЯ] К А > -КА,ОК # киска > кисок (мн,р.п.)
[АЕИОУЫЮЯ] К А > -КА,К # гадюка > гадюк (мн.,р.п.)
[ЖЦЧШ] К А > -КА,ЕК # девочка > девочек (мн,р.п.)
Й К А > -ЙКА,ЕК # майка > маек (мн,р.п.)
Ь К А > -ЬКА,ЕК # долька > долек (мн,р.п.)
А > М # стена > стенам (мн,д.п.)
А > МИ # стена > стенами (мн,т.п.)
А > Х # стена > стенах (мн,п.п.)
#
# существительные ж.р., оканчивающиеся на -я
#
Я > -Я,И # земля > земли (р.п.)
[^И] Я > -Я,Е # земля > земле (д.п.)
Я > -Я,Ю # земля > землю (в.п.)
Я > -Я,ЕЙ # земля > землей (т.п.)
# устаревшая форма

Я > -Я,ЕЮ # земля > землею (т.п.)
[ЕИУ] Я > -Я,Й # армия > армий (мн,р.п.)
[^АЕЗИЙОУЫЬЯ] Н Я > -НЯ,ЕН # вишня > вишен (мн,р.п.)
[АЕИОУЫЯ] Н Я > -Я,Ь # дыня > дынь (мн,р.п.)
Й Н Я > -ЙНЯ,ЕН # бойня > боен (мн,р.п.)
Ь Н Я > -ЬНЯ,ЕН # спальня > спален (мн,р.п.)
# р.п. мн.ч. слов на -ья нестандартен
Я > М # земля > землям (мн,д.п.)
Я > МИ # земля > землями (мн,т.п.)
Я > Х # земля > землях (мн,п.п.)



Необходимо его обработать, выбросив коментарии и некоторые лишние блоки.
Я произвожу считывание файла в массив и затем построчно его анализирую, используя следующий код.

PHP:
$pattern[0] = "/^((altstringchar)|(nroffchars)|(texchars)|(defstringtype)|(boundarychars)|(wordchars)|(stringchar)|(altstringtype)).*$/im";
	$pattern[1] = "/^\#(.|\s)*$/im";
	$pattern[2] = "/^(.+)\#(.*$)/im";	
	
	$replacement[0] = '';
	$replacement[1] = '';
	$replacement[2] = '$1';

	foreach ($affArr as &$dict_word) {
		//echo '<br>###'.'$1'.'###<br>';
		$dict_word = preg_replace($pattern, $replacement, trim($dict_word));
	}
Все бы ничего, и все работает, но в результате обработки НЕ ВСЕ строки отображаются корректно, а часть из них удааляется. Если строку
PHP:
$replacement[2] = '$1';
заменить на
PHP:
$replacement[2] = '$1$2';
, то выводятся все строки, но мне собственно и нужно взять только $1, а остальное отрезать.

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

Gorynych

Посетитель PHP-Клуба
vd
не совсем понятно, что Вы понимаете под "НЕ ВСЕ строки отображаются корректно"?

последняя замена предназначена для того, чтобы отбросить комментарий в конце строки. Т.е. для строки

" [ЖЦЧШ] К А > -КА,ЕК # девочка > девочек (мн,р.п.)"

отбросится часть, начинающаяся с "#"

" [ЖЦЧШ] К А > -КА,ЕК "

ну, возможно тут остается немного лишний пробел в конце строки, но в остальном понятно, как это работает.

так что поясните, какой результат Вы ожидаете и считаете корректным? Потому что на мой взгляд все вполне нормально.
 

invander

Новичок
А что мешает использовать preg_match, чтобы выцепить только то что нужно???
Гораздо проще и без лишних заморочек!!!

З.Ы. А можно поинтересоваться для каких целей используешь ispell???
 
Сверху