Перейти к содержимому

Фото
- - - - -

Нужна помощь


  • Вы не можете создать новую тему
  • Please log in to reply
18 ответов в этой теме

#1 alx4ever

alx4ever
  • Пользователь
  • 169 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 22 Ноябрь 2008 - 04:47

Допустим код:

function OB($str, $fromCache = false) {
	if (!eregi('<textarea ',$str)) {
		$str = _OB($str, $fromCache);
	} else {
		$str = preg_replace('/((?:(?!<textarea[^<]+<\/textarea>).*))/xe', "_OB('$1')", $str);
	}
	return $str;
}

function _OB($str) {
	$str = str_replace('\"','"',$str);
	return htmlspecialchars($str).$y;
}


$html = '<b>asfsdg</b>shdfhdfj<i>dfj</i>vxb
	<textarea name="dfhdfh">sdgsdgsddghghdallo</textarea>
	fgsgsg<b>sdgsdg<h/b>a
	<textarea name="hdfhd">sdgsdsdgdfhgsddghghdallo</textarea>
	sfsd<br>';

echo nl2br(OB($html));

Я уже 2 часа убил на поиски ответов :huh:

Вобщем мне нужно сделать замену всего HTML-а но кроме всего того что лежит например в элементе <textarea>

Может кто допишет этот код..
Надо только:
'/((?:(?!<textarea[^<]+<\/textarea>).*))/xe'
поменять...
  • 0

Аjaxel CMS, Фреймворк тоже.


#2 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 22 Ноябрь 2008 - 12:05

alx4ever, а такой вариант не подойдёт?
$html = '<b>asfsdg</b>shdfhdfj<i>dfj</i>vxb
	<textarea name="dfhdfh">sdgsdgsddghghdallo</textarea>
	fgsgsg<b>sdgsdg<h/b>a
	<textarea name="hdfhd">sdgsdsdgdfhgsddghghdallo</textarea>
	sfsd<br>';

echo strip_tags( $html, 'textarea' );

  • 0

#3 windburn

windburn
  • Пользователь
  • 61 сообщений

Отправлено 22 Ноябрь 2008 - 16:01

Да, тут реги и не нужны на самом деле... согласен с Сedar целиком и полностью;)
Зачем изобретить велосипед...

Сообщение изменено: windburn (22 Ноябрь 2008 - 16:03 )

  • 0

#4 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 22 Ноябрь 2008 - 16:10

согласен с Сedar целиком и полностью;)

Cedar - это я чтоль? Как меня только не называют, чаще всего seCtor :)
  • 0

#5 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 23 Ноябрь 2008 - 12:31

Почти Сербернар! :))
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#6 alx4ever

alx4ever
  • Пользователь
  • 169 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 23 Ноябрь 2008 - 13:44

Ой вы не поняли..

Мне нужен не htmlspecialchars - это быо просто как тест чтоб видеть изменения.

Вобщем у меня проект где тип ссылок можно переключать с friendly до ajax-а, и если юзер открывает страницу где textarea то мне не хотелось бы случайно заменять ссылки в его тексте.. вот..
А эта функция работает как callback к ob_start()

Есть соображения?

и ещё, приостановить ob_start ob_flush-oм а затем заново ob_start не подходит, так как страница html ещё проходит gzipcompress а также два callback-а с ob_start в php невозможно, вобщем эт единственный вариант замена всего кроме textarea
  • 0

Аjaxel CMS, Фреймворк тоже.


#7 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 23 Ноябрь 2008 - 16:24

alx4ever, нифига не понял :)

Т.е. ты хочешь из кода страницы все ссылки заменить на ajax'овые кроме ссылок, которые находятся в textarea?

Самый топорный вариант - имея код страницы, заменить все textarea'ы на какой-то уникальный флаг, сохранив содержимое textarea'в, заменить все ссылки на "чистой от textarea" странице и на место флажков вернуть содержимое textarea'в.

Регулярки не всесильны :) Это как сложные запросы к БД - можно написать суперсложный запрос с кучей подзапросов и это будет тормозить из-за нехватки памяти (будет использоваться сортировка на диске), а можно написать 3 небольших запроса, которые делают то же самое, но эффективно используют индексы и получится в разы быстрее.

Сообщение изменено: Setor (23 Ноябрь 2008 - 16:25 )

  • 0

#8 windburn

windburn
  • Пользователь
  • 61 сообщений

Отправлено 23 Ноябрь 2008 - 16:45

preg_match_all("/(.+)(?<=<textarea>)(.+)(?<=<\/textarea>)(.+)/", $html, $array);

И тогда по идее
$array[0] - вся строка
$array[1] - все, что идет до тега textarea
$array[2] - содержимое textarea
$array[3] - все, что идет после тега textarea
  • 0

#9 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 23 Ноябрь 2008 - 16:47

windburn, а если textarea несколько? :)

ЗЫ: если их несколько, можно сделать preg_split
  • 0

#10 windburn

windburn
  • Пользователь
  • 61 сообщений

Отправлено 23 Ноябрь 2008 - 16:48

Сразу каюсь, код не проверял, но работать теоритически должен...если нигде скобочку не пропустил;)
Setor, как сказал автор, "лежит в элементе textarea". Значит, он один?)
  • 0

#11 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 23 Ноябрь 2008 - 16:57

windburn, поверь, автор бы до такого додумался :)

Вообще, имхо, тут налицо ситуация с неправильным подходом к решению проблемы. Если надо менять ссылки и они статичны, то я бы использовал helper для их генерации. Если же ссылки вводит пользователь (например, в админке), то откуда там взяться textarea'м?)

Если бы я столкнулся с подобной проблемой, я бы пытался искать альтернативные варианты её решения. Код обязан быть простым, любое прешение должно быть простым, иначе мы заведомо имеем бомбу замедленного действия.

Например, я парсил сайты с десятками тысяч страниц и на 10 страницах могло встретиться что-то нестандартное, чего не было на остальных страницах, я старался не использовать сложных ругулярок, а разбивал их на много более мелких - простых и это позволяло мне в нетипичных случаях управлять процессом!
  • 0

#12 windburn

windburn
  • Пользователь
  • 61 сообщений

Отправлено 23 Ноябрь 2008 - 17:22

Кстати, а можно сделать отдельную функцию для генерации ссылок. И подставлять их в код не чистым хтмлом, а функцией
<table>
<tr> <td> <?php insertLink('main.php?var1=1&var2=2', 'Link Description'); ?> </td></tr>
</table>

И пусть функция в зависимости от желания юзверя выдает friendly ccылки, ajax, какие угодно...
  • 0

#13 alx4ever

alx4ever
  • Пользователь
  • 169 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 23 Ноябрь 2008 - 17:25

Спасибо за ваши ответы.

Вобщем, helper функция отпадает, она есть но, <a href="?link=yep"> должен у меня заменяться на <a href=/link-yep"> либо на <a href="java script:get('?link=yep')">, поскольку юзер может забыть сделать вот так: <a href="<?=url('?link=yep')?>">

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

windburn, твоё решение верно, и со флагами верно и вполне реально вот так будет сделать, н опять таки оптимизация лучше через один regex чем несколько и ещё с циклом, но видимо это останется единственным вариантом если ничего не найду другого лучшего..

А так, должен заметить, на этом форуме тусуются и реальные программисты))

Сообщение изменено: alx4ever (23 Ноябрь 2008 - 17:30 )

  • 0

Аjaxel CMS, Фреймворк тоже.


#14 windburn

windburn
  • Пользователь
  • 61 сообщений

Отправлено 23 Ноябрь 2008 - 17:46

Вы мну извините, конечно, но что за helper?..

alx4ever, Благодарствую;)
  • 0

#15 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 23 Ноябрь 2008 - 17:52

Кстати, а можно сделать отдельную функцию для генерации ссылок. И подставлять их в код не чистым хтмлом, а функцией

<table>
<tr> <td> <?php insertLink('main.php?var1=1&var2=2', 'Link Description'); ?> </td></tr>
</table>

И пусть функция в зависимости от желания юзверя выдает friendly ccылки, ajax, какие угодно...

Это и есть helper-функция :)
  • 0

#16 windburn

windburn
  • Пользователь
  • 61 сообщений

Отправлено 23 Ноябрь 2008 - 18:00

Ой... выходит, я плагиатор Размещенное изображение
  • 0

#17 alx4ever

alx4ever
  • Пользователь
  • 169 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 23 Ноябрь 2008 - 19:42

Эхх.. не очень хорошо, но.. работает!!! :D :D :D

<?
function OB($str, $fromCache = false) {
	if (!eregi('<textarea ',$str)) {
		$str = _OB($str, $fromCache);
	} else {
		$str = substr(preg_replace('/(.*)(<textarea.*>.*<\/textarea>|\svalue=".*")/Use', "_OB('$1','$2')", $str.'<textarea></textarea>'),0,-21);

	}
	return $str;
}

function _OB($replace, $leave) {
	$replace= str_replace('\"','"',$replace);
	$leave= str_replace('\"','"',$leave);
	return replaceLinks($replace).$leave;
}

function replaceLinks($html) {
	// this is the test only
	return htmlspecialchars($html);
}

$html = '<b>one</b>aaaaaa<i>dfj</i>aaaa
	<textarea name="dfhdfh">sdgsdgsddgh<b>dfds</b>ghdallo</textarea>
	bbbbb<b>bbbb</b>a
	<textarea name="hdfhd">sdgsdsdgdfhgsddghghdallo</textarea>
	aaa<b>adad</b>aa
	<textarea name="hdfhd">sdgsdsdgdfhgsddghghdallo</textarea>
	aaa<b>adad</b>aa
	<textarea name="hdfhd">sdgsdsdgdfhgsddghghdallo</textarea>
	ccc<b>ssss</b>cc<br>';

echo nl2br(OB($html));
?>

Regexp делит строку на части и я кое какие части заменяю а другие оставляю как есть
Но последняя строка: "ccc<b>ssss</b>cc<br>" почему то не трогается пришлось применить хак вставив ещё одну <textarea> а потом стерев её..

Уучитесь пацаны-программисты ;)

Сообщение изменено: alx4ever (23 Ноябрь 2008 - 19:43 )

  • 0

Аjaxel CMS, Фреймворк тоже.


#18 windburn

windburn
  • Пользователь
  • 61 сообщений

Отправлено 23 Ноябрь 2008 - 20:11

С точки зрения банальной эрудиции надо бы
'/(.*)(<textarea.*>.*<\/textarea>|\svalue=".*")/Use'

заменить на
'/(.*)(<textarea.*>.*<\/textarea>|\svalue=".*")(.*)/Use'

Потому что после закрывающего тега textarea у тебя ничего не ищется. А после этого текст надо ведь тоже обрабатывать

Сообщение изменено: windburn (23 Ноябрь 2008 - 20:12 )

  • 0

#19 alx4ever

alx4ever
  • Пользователь
  • 169 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 24 Ноябрь 2008 - 08:09

windburn,

А вот и нет :) я пробовал.

Но ты ничего не понял, когда /e - evaluate то regex берёт то что в паттерне и разбивает это на куски применяя каждый кусок к функции а затем после callback-а склеивает.

Попробуй ;)
  • 0

Аjaxel CMS, Фреймворк тоже.