[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Чистка массива по стоп словам
Страницы: 1, 2
tapper90
Доброго дня.
Я новичок в php, прошу помочь советом.

Имеется следующий код:
if($_POST){
$in = $_POST['in'];
$out = $_POST['out'];

$outarray = str_replace("\r", '<br />', $out);

$inarray = explode("\n", str_replace("\r", '', $in));
foreach($inarray as $val)
{
//$unival = quotemeta($val);
$zamena = preg_replace("/(.*)$val(.*)/i", "", $outarray);
echo "<br />".$zamena;
}
}


Идея такая. На странице находится форма с двумя textarea - in и out
В in построчно вводятся стоп-слова
В out построчно вводятся слова из которых нужно удалить все слова из in.
Причем не просто удалить, а по регулярке (.*)слово(.*)

Код который я написал - работает, только если в поле in 1 значение, если их больше то скрипт работает неправильно. Это связанно с циклом. Получается, что для каждого значения in происходит замена.

Напишите пожалуйста как переделать\
Игорь_Vasinsky
1. получить из 2х textarea 2 массива - с использованием

$in = explode(PHP_EOL, $_POST['in']);
$out = explode(PHP_EOL, $_POST['out']);

и с умом использовать http://php.net/manual/en/function.array-diff.php

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
tapper90
Цитата
и с умом использовать http://php.net/manual/en/function.array-diff.php


Эта функция не подходит.
Я писал выше.

Например, в массиве in может быть значение "123", а в out "блабла123бла". Для этого я использую preg_replace
tapper90
Запарился уже. Что только не пробывал. Вот так это дело выглядит
inpost
tapper90
Приведи реальный пример того, где именно на практике ты это собираешься применить.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
tapper90
вот пример - http://marilynstyle.ru/scripts/stopcleaner/
если в левое поле ввести больше 1 значения, то срабатывает fucking цикл и результат задваивается. Как сделать без цикла я не знаю
killer8080
$in = ' 
foo
андрей
bar
baz'
;
$out = '
some word foo
string baz Андрей with
barcode
'
;
$words = array_map('preg_quote', array_unique(array_filter(array_map('trim', explode("\r\n", $in)))));
$regexp = '#\b' . implode('\b|\b', $words) . '\b#iu';
echo '<pre>'.preg_replace($regexp, '<span style="background-color: yellow; color: red;">$0</span>', $out).'</pre>';
waldicom
Цитата (killer8080 @ 4.04.2015 - 22:11)
$words = array_map('preg_quote', array_unique(array_filter(array_map('trim', explode("\r\n", $in)))));

однако! smile.gif

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
tapper90
Цитата
$in = '
foo
андрей
bar
baz';
$out = '
some word foo
string baz Андрей with
barcode
';
$words = array_map('preg_quote', array_unique(array_filter(array_map('trim', explode("\r\n", $in)))));
$regexp = '#\b' . implode('\b|\b', $words) . '\b#iu';
echo '<pre>'.preg_replace($regexp, '<span style="background-color: yellow; color: red;">$0</span>', $out).'</pre>';


проверил - тоже не то, или даже совсем не то

$in = 'foo';
$out = 'foo342';
не прокатывает
killer8080
Цитата (tapper90 @ 5.04.2015 - 01:46)
$in = 'foo';
$out = 'foo342';
не прокатывает

ну тогда убери \b, я думал нужно вырезать только слово целиком.
tapper90
Цитата
ну тогда убери \b, я думал нужно вырезать только слово целиком.


Убрал.
Теперь в "foo342" происходит выделение у "foo".
Я так понял, нужно еще пошаманить с
$regexp = '#' . implode('|', $words) . '#iu'; 


Как сделать, чтобы выделение было у всего foo342?

П.С. В массиве $out каждое значение на отдельной строке
$in = '
foo
андрей
bar
baz';
$out = '
some
word
foo342
string
baz
Андрей
with
barcode
killer8080
$in = ' 
foo
андрей
bar
baz'
;
$out = '
some word foo
string baz Андрей foo342 with
barcode
'
;
$words = array_map('preg_quote', array_unique(array_filter(array_map('trim', explode("\r\n", $in)))));
$regexp = '#\w*' . implode('\w*|\w*', $words) . '\w*#iu';
echo '<pre>'.preg_replace($regexp, '<span style="background-color: yellow; color: red;">$0</span>', $out).'</pre>';
tapper90
Класс!

Спасибо огромное! Получилось!!

Там появилась проблемка, может заодно подскажите?
Если в массиве $out есть точка, то совпадение не полное выходит. Выделяется только то что до точки.

$in = '
foo
андрей
bar
baz';
$out = '
some word foo.2241
string baz Андрей foo342 with
barcode
';

user posted image
killer8080
\w замени на \S
tapper90
Ага, получилось!
laugh.gif laugh.gif laugh.gif
Быстрый ответ:

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