Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238

Как удалить символ хэш-тега, после парсинга тегов?

23.04.2015, 15:07. Показов 1274. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет народ. Составляю выражение в PHP, нужно выделить слова, начинающиеся с восклицательного знака (как бы символ хэш-тега), это просто, вот такое выражение составил
preg_match("[\s]+[!][\w\d]+", $text, $matches);
но теперь нужно выделять их сразу без восклицательного знака, не знаю как это сделать, не хотелось бы потом перебирать все вхождение и удалять оттуда первый символ. Есть идеи?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2015, 15:07
Ответы с готовыми решениями:

Как удалить весь текст после тега?
Задача банальная. Есть текст "123456789ыоа$шыоермшгкеругшру7кпмрк". Задача программы удалить ВСЁ после символа $, что бы на...

Удалить лишние символы после парсинга
Добрый вечер! Уже киплю... Перепробовал уже с 10-ток всяких функций по работе со строками после парсинга. Имеется строка вида: echo...

В заданной строке удвоить символ после первого пробела и удалить символ после последнего пробела.
Разработать программу, которая в заданной строке удваивает символ, стоящий после первого пробела и удаляет символ, стоящий после последнего...

9
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
23.04.2015, 15:14
Лучший ответ Сообщение было отмечено NoobsEnslaver как решение

Решение

NoobsEnslaver, вроде бы так должно работать:
PHP
1
2
preg_match_all("/[\s]+[!]([\w\d]+)/u", $text, $matches);
print_r($matches[1]);
Или так:
PHP
1
2
preg_match_all("/(?<!\w)!([\w\d]+)/u", $text, $matches);
print_r($matches[1]);
1
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
23.04.2015, 15:31  [ТС]
Спасибо, идею в первом случае понял - если заключить в круглые скобки, то промежуточный результат сохранится, читал что то такое А зачем там / и /u ? Второй пример чёт не понял.. ну ладно, если первый заработает - мне этого хватит ^_^ дома буду через час-два, там проверю (на этом компе не стоит апач).
А, кстати, а если я еще выделяю позиции этих вхождений с помощью атрибута PREG_OFFSET_CAPTURE, где у меня будут позиции, а где строки (в справке не совсем внятно написано)? Такое сработает:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
//выше были всякие подключения к БД и тд.
$select_hum_id = $mysqli->prepare("SELECT hum_id FROM assoc WHERE subname=?"); //подготовили выражение к БД
if(!$select_hum_id){echo "Не удалось подготовить запрос, текст ошибки: ",$mysqli->error; die;}; //БД схавала это?
$select_hum_id->bind_param($match[0]); //Входной параметр - $matches[0] (она еще не объявлена и вообще объявится в цикле, сработает ли?)
$select_hum_id->bind_result($hum_id); //выходной параметр.
 
foreach ($matches as $match) {
    //$match[0] - Найденная строка
    //$match[1] - Её позиция, потом будет использоваться в replace()
    echo $select_hum_id->execute() ?
        $match[0].' это кличка человека с id='.hum_id.'<br>':
        'В базе данных кличек такого человека нет.<br>';
}
Имею ввиду перебор с foreach, ну и с БД, если ты и в этом шаришь
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
23.04.2015, 15:59
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
А зачем там / и /u ?
Ну, это вам наверно не нужно. Я тестировал в песочнице на тексте из вашего же вопроса и, т.к. там кириллица, то поставил этот флаг.
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
PREG_OFFSET_CAPTURE, где у меня будут позиции
На выходе многомерный массив, каждый из элементов которого, содержит вхождение и позицию:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
$text = 'Привет народ. Составляю !выражение в PHP, нужно выделить слова, !начинающиеся с восклицательного знака (как бы символ хэш-тега), !это !просто, вот такое выражение составил';
preg_match_all("/(?<!\w)!([\w\d]+)/u", $text, $matches, PREG_OFFSET_CAPTURE);
print_r($matches[1]);
// результат
Array
(
    [0] => Array
        (
            [0] => выражение
            [1] => 45
        )
 
    [1] => Array
        (
            [0] => начинающиеся
            [1] => 113
        )
 
    [2] => Array
        (
            [0] => это
            [1] => 230
        )
 
    [3] => Array
        (
            [0] => просто
            [1] => 238
        )
 
)
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
Такое сработает
Нет и это как бы очевидно. Как можно использовать не инициализированную переменную? И может быть логичней тогда использовать mysqli_multi_query? Хотя, тут уже вам видней должно быть.

Добавлено через 8 минут
UPD
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
А зачем там / и /u ?
Я сразу и не вкурил, про что вы... Так без разделителей (в моём случае слэши) вы получите на выходе только ошибку.
1
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
23.04.2015, 16:09  [ТС]
Ну я так и думал, так конструкция с foreach сработает значит?
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Нет и это как бы очевидно. Как можно использовать не инициализированную переменную?
Как по мне, не так уже это очевидно. Это же интерпретируемый язык, может там просто ссылка на имя используется? Или при обращении к ней она какраз и создается, только пока что со значением NULL, а когда я вызову execute с нее считается, но к тому моменту там уже будет нормальное значение.

Цитата Сообщение от Lazy_Den Посмотреть сообщение
И может быть логичней тогда использовать mysqli_multi_query?
Да, не знал о ней. Это будет быстрее, но и код сложнее выйдет. Незнаю, правда как её даже тут использовать - мне же надо получить соответствие - вхождение - id. Но если я сделаю запрос не по каждому вхождению, а SELECT hum_id FROM assoc WHERE subname IN $matches, то я получу id в том порядке, в каком они идут в базе.

Добавлено через 4 минуты
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Я сразу и не вкурил, про что вы... Так без разделителей (в моём случае слэши) вы получите на выходе только ошибку.
Тоесть, это могут быть и пара [ и ] ? А u зачем? она же не пара / ?
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
23.04.2015, 16:17
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
А u зачем? она же не пара / ?
Об этом я говорил в начале. Читайте тут
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
Как по мне, не так уже это очевидно.
Даже не знаю, что и сказать на это...
0
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
24.04.2015, 14:24  [ТС]
Проверил все описанные выше решения и вот что имею:
PHP
1
2
3
4
5
6
7
    preg_match_all("/[\s]+[!]([\w\d]+)/u", $text, $matches,PREG_OFFSET_CAPTURE);
    $options = '';
    foreach ($matches as $match) {
       foreach ($match as $opt) {
          $options = $options.'<option value="q" label="'.$opt[0].'" />';};
           }
    };
Т.е. на выходе трехмерный О_о массив, первый индекс - выбор - с восклицательным знаком или без него, второй - выбор одного из найденных слов, третий - слово или его позиция. Странно вообще, что порядок индексов такой, что не выбор слова первый, а выбор его варианта (с воскл. или без). Как избавиться от этой первой размерности?
Еще - неинициализированную переменную в bind_param действительно нельзя использовать Но в bind_result можно.
P.S. Оба предложенных варианта работают одинаково.
Миниатюры
Как удалить символ хэш-тега, после парсинга тегов?  
0
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
24.04.2015, 19:55  [ТС]
P.S. Можно конечно сделать так:
PHP
1
2
for($i=0; isset($matches[1][$i][0]); $i++) 
    {$options = $options.'<option value="q" label="'.$matches[1][$i][0].'" />';}
Но ведь это не джедайский путь, хотелось бы именно выборку не избыточную.

Добавлено через 5 часов 16 минут
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
Как по мне, не так уже это очевидно.
Даже не знаю, что и сказать на это...
Посмотри вот это http://php.net/manual/ru/mysqli-stmt.execute.php , первый пример - там переменные привязываются раньше, чем были хоть раз упомянуты.
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
24.04.2015, 21:06
Цитата Сообщение от NoobsEnslaver Посмотреть сообщение
Посмотри вот это
Что я могу сказать? Есть две новости и обе хорошие. Первая новость - хорошая для вас, т.к. состоит в том, что в MySQLi таки можно так делать. А вторая новость хорошая для меня, т.к. безумно рад, что в своё время с mysql_* перешёл на PDO, а не MySQLi. В том же примере, на который вы дали ссылку, если убрать перед вторым запросом какую-то из переменных (напр., $val3), то запишется значение из предыдущего запроса, а если убрать переменную в первом запросе, то данные этого запроса вообще не запишутся. И это всё бы ничего, но при этом даже Exception не выбрасывается, типа так и надо. Бред какой-то!
0
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
25.04.2015, 13:09  [ТС]
Цитата Сообщение от Lazy_Den Посмотреть сообщение
безумно рад, что в своё время с mysql_* перешёл на PDO, а не MySQLi.
Пока пользоваться довольно удобно. Вот финальный вариант участка кода, если интересно:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
preg_match_all("/[\s]*[!]([\w\d]+)/u", $text, $matches,PREG_OFFSET_CAPTURE);
    
    $invoke_real_name = $mysqli->prepare('SELECT DISTINCT peoples.id, fname, lname FROM peoples, assoc WHERE peoples.id=hum_id AND subname=? ORDER BY power DESC');
    if(!$invoke_real_name){echo "Не удалось подготовить запрос, текст ошибки: ",$mysqli->error; die;};
    
    $invoke_real_name->bind_result($id, $fname, $lname);
    $invoke_real_name->bind_param("s",$subname);    
 
    for($i=0; isset($matches[1][$i][0]); $i++) 
    {
        $subname=$matches[1][$i][0];
        if(!$invoke_real_name->execute())
            {echo "Ошибка выполнения запроса, текст ошибки ", $mysqli->error; die;}
            
        $options = $options.'<tr><td><b>'.$subname.'</b></td><td><select name="'.$i.'">';
        while($invoke_real_name->fetch())
        {
            $options = $options.'<option value="'.$id.'"  >'.$fname.' '.$lname.'</option>';
        };
        $options = $options.'</select></td></tr>';
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2015, 13:09
Помогаю со студенческими работами здесь

Удалить из строки определенный символ и символ после него
Пример: §b§lТекст§c§8Text Должно стать: ТекстText Пожалуйста, помогите.

Можно ли удалить скриптом строчку после тега /html
На бесплатном хостинге после тега /html добавляется строка &lt;script type=&quot;text/javascript&quot;...

Удалить ненужный автодобавляемый код счетчика после тега </HTML>
Привет форумчанам, у меня небольшая проблемка, надеюсь поможете.)) Дело в хостинге - он мне пытается незаметно подсунуть код своего...

Отображение тегов внутри тега pre
Здравствуйте! Пожалуйста, подскажите. Требуется внутри тега pre cделать, чтобы отобразился на странице тег &lt;br /&gt; в виде...

DLE 9.2 Вывод тега похожих новостей и других тегов
Такая поблема. DLE 9.2 выводит на странице сам тег {related news}, а также когда вставляю теги для вывода рекламных материалов тоже вместо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru