помогите с регулярным выражением (ВВ-теги!)

Лисю

Guest
помогите с регулярным выражением (ВВ-теги!)

звёздчки в коде я поставил, что бы этот форум не съел теги

PHP:
//--------------------------------------------------------------------
//	Обрамляет email адрес тегами [*EMAIL=...]...[/EMAIL*]
//--------------------------------------------------------------------
function ereg_post_mail_urls($in){
	echo $in = preg_replace(
	"#
	(?:^|[^=\\]/])
		([a-z0-9_.\\-]+@[a-z0-9_.\\-]+\\.[a-z]{2,4})
	(?:[^\\[\\]]|$)
	#ix",
	"[*EMAIL=$1]$1[/EMAIL*]",$in);
	exit;
}
Этот код обрамляет емейл-адрес соответствующими ВВ-тегами при записи в БД.
И справляется с этим успешно.

Но когда уж обрамлённую строку такими тегами обработать этой функцией, то она вопреки коду, снова обрамляет емейл-адрес, но игнорируя первый символ емейла.

В чем заключается смысл патерна: найти mail адрес, в начале которого НЕТ символов '=', ']' и '/'. Зачем последний - не помню.
так же и в конце емейл адреса не должно быть символов [ и ].

Пример: вводим первый раз адрес [email protected]

результат работы:

[*[email protected]][email protected][/EMAIL*]


Редактируем запись, сохраняем. Результат:

[*EMAIL=[*[email protected]][email protected][/EMAIL]][email protected][/EMAIL*][/EMAIL*]

Т.е. программа хитро делает - игнорирует первый символ i в email адресе и заменяет всё, что ей удалось найти.

Как это побороть?

Дело в том, что аналогичный код для URL
PHP:
function prefix_url($in){
	$in[1] = strToLower($in[1]);
		if($in[1]=="www.")
			$in[1] = "http://www.";
				return "[URL=$in[1]$in[2]]$in[1]$in[2][/URL]";
}


function ereg_post_urls($in){             
	$in = preg_replace_callback(
	"#
		(?:^|[^=\\]/])
			(
			(?:f|ht)tps?://(?:www\\.)?|www\\.
			)
			
			(
			(?:[\w\\-.]+/?\\.[a-z]{2,4})/?~?
			(?:[\w\\-./\\#]+)?
			(?:\\?[\w\\-&=%+~;\\#]+)?
			)
		(?:[^\\[\\]]|$)
	#ix",
	"prefix_url", $in);
	
	return ereg_post_mail_urls($in);
}
прекрасно работает!
 

whirlwind

TDD infected, paranoid
(?:^|[^=\\]/])

используйте более четкую формулировку чего там не должно быть. конкретно
 

Лисю

Guest
whirlwind
гы... (?:^|[^email=\\]/]) вроде работает.. ща тестить буду...

-~{}~ 30.11.05 17:55:

Замечательно работает! Спасибо whirlwind!

-~{}~ 30.11.05 17:55:

Только почему старая конструкция не работала - я не понял.
 

whirlwind

TDD infected, paranoid
Потому что поиск идет слева-направо. Дословно:

(?:^|[^=\\]/])

ищем символ, отличающийся от =,\,],/. Первая буква адреса емейла прекрасно подходит в эту категорию. Остальная часть емейла (но уже без первой буквы, т.к. первая буква ушла в доп. конструкию) совпадает с шаблоном емейла.

-~{}~ 01.12.05 10:17:

Кстати, не стоит определять шаблон лексемы классом символов, т.к. в этм случае проверяется соответствие символу из набора, на не последовательности символов. В данном случае будут совпадения не только [email= но и [meail=, liam=e, etc...
 
Сверху