|
|
|
|
|
для: heed
(29.01.2010 в 15:58)
| | так а какая разница в каком порядке слова в массиве?)
всё равно ведь заменяет.. | |
|
|
|
|
|
|
|
для: sl1p
(29.01.2010 в 15:09)
| | если нужно чтобы вводить можно было по разному, можно попробовать по длиннам строк уполрядочмвать
function lencmp($a, $b)
{
if (strlen($a) == strlen($b)) {
return 0;
}
return (strlen($a) > strlen($b)) ? -1 : 1;
}
$arr = array('#кварт\w*#i', '#квартир\w*#i', '#квартир\w* посуточно#');
usort($arr, 'lencmp');
print_r($arr);
|
| |
|
|
|
|
|
|
|
для: heed
(29.01.2010 в 13:19)
| | посуточные запосуточнить
таких слов не может быть :)если вы не например а про мой вариант.
могут быть "квартиры посуточно", "квартира посуточно" и оно должно быть важнее чем просто "квартир\w*"..
вот. | |
|
|
|
|
|
|
|
для: sl1p
(29.01.2010 в 13:13)
| | >#квартир\w*#i
>#квартир\w* посуточно#
Так тут надо просто стазу определяться какие квартиры нужнее ,) посуточные или понесуточные :)
Если посуточные запосуточнить раньше чем непосуточные , то непосуточные понезапосуточнятся.
И там в массиве просто первое выражение урезанное.
//upd
и кажется split() вроде покушались с шестой версии php транклютировать , если я правильно понял что такое ereg-функции. | |
|
|
|
|
|
|
|
для: heed
(29.01.2010 в 12:05)
| | выражение: #<a\b[^>]*>[^<]*</a\s*>|\b'. $v .'\b#i
порадовало :)
но теперь получилась такая штука:
#квартир\w*#i
#квартир\w* посуточно#
|
<a href="http://localhost/apartments" target="_blank" class="keyword">квартиры</a> <a href="http://localhost/apartments" target="_blank" class="keyword">КваРтира</a>
<a href="http://localhost/apartments" target="_blank" class="keyword"><a href="http://localhost/apartments2" target="_blank" class="keyword">квартиры посуточно</a></a> | |
|
|
|
|
|
|
|
для: sl1p
(28.01.2010 в 12:22)
| | тогда наверное только как-нибудь так
<form action="" method="post">
<textarea name="re">
с%
hr%
а%
</textarea>
<input type="submit" value="x"/>
</form><pre><?php
$txt = '
ну пользователю можно вводить только "\w+"
остальное убираю preg_quote и т.д.
href
символ % заменяю на \w*
а дальше идёт замена составленого выражения из слова
';
function linker($m){
return ($m[0]{0} == '<') ? $m[0] : '<a href="#">'. $m[0] .'</a>';
}
if(isset($_POST['re'])) {
$re = split("[[:space:]]*\n[[:space:]]*"
, str_replace('%', '\w*', preg_quote( trim($_POST['re']), '#')));
print_r($re);
foreach($re AS $k => $v) {
if ($v === '') {
unset($re[$k]); break;
}
if (!$k) $re[$k] = '#\b'. $v .'\b#i';
else $re[$k] = '#<a\b[^>]*>[^<]*</a\s*>|\b'. $v .'\b#i';
echo "\n". htmlspecialchars($re[$k]);
}
if ($re[0]) $txt = preg_replace_callback($re, 'linker', $txt);
}
echo $txt;
|
вместо foreaach можно array_walk() какой-нибудь прикрутить
и с (<a\b[^>]*>)?(?(1)..... это работало только если сразу в <a> шло слово
, а чтобы какое-нибудь href не захавало похоже ещё сложнее чего-нибудь вставлять
//upd
хотя такой ещё вариант
<?php
$txt = '
<a href="#">x - символ</a>
y - символ
';
echo preg_replace('#\bсимв\w+\b(?!(?:(?!<a\b).[^<]*)*</a\b)#', '<a href="#">$0</a>', $txt);
|
| |
|
|
|
|
|
|
|
для: heed
(28.01.2010 в 22:32)
| | ну слова вводятся в текстареа и каждая новая строка = новое слово и в preg_replace суётся массив выражений. Так что такой вариант не прокатит 6) | |
|
|
|
|
|
|
|
для: sl1p
(28.01.2010 в 12:22)
| | Если я правильно понял самый первый вопрос
>нужно сделать так, чтобы слева от слова, был не словестный символ и оно не находилось бы уже в теге <A>...
предлагаю следующий вариант
#<a(?:(?!\b$keyWord\b)[^>])*>.*?(?<=[\W])($keyWord).*?</a>#i
|
| |
|
|
|
|
|
|
|
для: sl1p
(28.01.2010 в 21:49)
| | всёравно не понял, если текст заменяется по просто тексту одним preg_replace()
, то чем не устраивает например простое выражение
<form action="" method="post">
<input type="text" name="re" value="с%"/>
<input type="submit" value="x"/>
</form><pre><?php
$txt = '
ну пользователю можно вводить только "\w+"
остальное убираю preg_quote и т.д.
символ % заменяю на \w*
а дальше идёт замена составленого выражения из слова
';
$re = '';
echo (isset($_POST['re'])
&& ($re =str_replace('%', '\w*', preg_quote( trim($_POST['re']), '#'))))
? preg_replace('#\b'. $re .'\b#i', '<a href="#" class="keyword">$0</a>', $txt)
: $txt;
echo "\n\n\n". '#\b'. $re .'\b#i'
. "\n\n\n". '#(<a\b[^>]*>)?(?(1)(?!)|\b'. $re .'\b)#i';
| только не учёл magic_quotes , и вообще думаю что нужно от пользовательского ввода оставить только \w и %
или ессли введено два слова идёт поиск каждого по очереди? | |
|
|
|
|
|
|
|
для: heed
(28.01.2010 в 21:06)
| | ну пользователю можно вводить только "\w+"
остальное убираю preg_quote и т.д.
символ % заменяю на \w*
а дальше идёт замена составленого выражения из слова на
<a href="#" class=\"keyword\">$0</a>
ну пользователь пока я:)) это для админки, поэтому ничего левого быть не может :)
для начала хотелось бы разобраться с самим выражением:) | |
|
|
|
|