Смотрю книгу вижу фигу
32 / 23 / 11
Регистрация: 12.11.2016
Сообщений: 97
1

Пропустить апострофы в слове

08.02.2021, 23:45. Показов 2406. Ответов 8

Author24 — интернет-сервис помощи студентам
Добрый вечер,

Выполняю поиск и замену всех ненужный символов по регулярному выражению с помощью preg_replace()

Есть произвольная строка
PHP/HTML
1
$names = "''''''''Mary's''''''''James's'''''''Babaykin's'''''''";
Пытаюсь сделать так, чтобы апострофы были заменены все, кросе которых относятся к слову
PHP
1
$result = preg_replace('/[^a-zA-Z\s]/u', '', $names);
Такая запись дает такой результат
PHP/HTML
1
Marys Jamess Babaykins
Если добавить \' за квадратными скобками
PHP
1
$result = preg_replace('/[^a-zA-Z\s]\'/u', '', $names);
Получу такое
PHP/HTML
1
Mary's James's 'Babaykin's'
Как добится такого результат?
PHP/HTML
1
Mary's James's Babaykin's
Чтоб апострофы пропускались только в средине слова

Добавлено через 10 минут
Ответ примерно такой похоже
PHP
1
$result = preg_replace('/[^a-zA-Z\s]\'+/u', '', $names);
Вывод
PHP/HTML
1
Mary's James's Babaykin's
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2021, 23:45
Ответы с готовыми решениями:

Пропустить\не пропустить при слиянии
Здравствуйте! Такое дело: выполняю слияние двух документов. Все вроде бы хорошо, да вот только...

Кавычки и апострофы
Кавычки и апострофы в C++ работают как и в пхп? Кавычки- весь внутренний код прогоняется как...

Апострофы в условии
Доброго времени, вопрос следующий: Как, в условии if сравнивать символы с апострофом? я никак не...

mySQL и апострофы
Уверен, что мой вопрос тривиален, но не нашел ответов на форуме. как вставить в таблицу строку с...

8
Невнимательный
2573 / 957 / 314
Регистрация: 08.02.2013
Сообщений: 5,676
Записей в блоге: 2
08.02.2021, 23:45 2
Лучший ответ Сообщение было отмечено Onloock как решение

Решение

Цитата Сообщение от Onloock Посмотреть сообщение
в средине слова
возможно не самое оптимальное
Bash
1
2
3
4
5
6
7
8
cat <<\x | /c/srv/usr/php74/php
 
<?php
$names = "''''''''Mary's''''''''James's'''''''Babaykin's'''''''";
echo $result = preg_replace('/[A-Za-z]+(?>\'[A-Za-z]+)?(*SKIP)(?!)|\'+/u', '', $names), "\n";
x
 
Mary'sJames'sBabaykin's
... и непонятно откуда взялись пробелы

Цитата Сообщение от Onloock Посмотреть сообщение
'/[^a-zA-Z\s]\'+/u'
оставит X' если $names = "X' '''''''Mary's''''''''James's'''''''Babaykin's'''''''";
0
Смотрю книгу вижу фигу
32 / 23 / 11
Регистрация: 12.11.2016
Сообщений: 97
08.02.2021, 23:59  [ТС] 3
x_lab,
Цитата Сообщение от x_lab Посмотреть сообщение
... и непонятно откуда взялись пробелы
Спасибо за ответ
Я удалил пробелы случайно, когда решил убрать пару одинаковых кавычек одинарных

Добавлено через 10 минут
Цитата Сообщение от x_lab Посмотреть сообщение
оставит X' если $names = "X' '''''''Mary's''''''''James's'''''''Babaykin's'''''''";
За это замечание отдельно спасибо.
Учусь, иногда не пробую разные варианты проверки своего решения.
Будет наукой

Можете вкратце пройти по регулярному выражению, что происходит на каждом этапе работы шаблона?
0
Невнимательный
2573 / 957 / 314
Регистрация: 08.02.2013
Сообщений: 5,676
Записей в блоге: 2
09.02.2021, 00:24 4
Цитата Сообщение от Onloock Посмотреть сообщение
Можете вкратце
просто ишет одно|другое
одно из них заканчивается не совпадающим ни с чем (?!)
но не сбрасывает позицию курсора в проверяемой строке, благодаря (*SKIP)

... в документации к php нет про (*SKIP) есть к pcre https://www.pcre.org/current/d... html#SEC25,
но не искал особо ,) может где и на русском языке можно почитать
объяснения своими/моими словами бывает приводит к противоположному результату ))
0
Смотрю книгу вижу фигу
32 / 23 / 11
Регистрация: 12.11.2016
Сообщений: 97
11.02.2021, 15:41  [ТС] 5
x_lab, спасибо большое) В принципе понял, информацию по ссылки обязательно почитаю. Регулярными выражениями плохо владею. Любая информация важна.
Цитата Сообщение от x_lab Посмотреть сообщение
просто ишет одно|другое
Как Вы одно|другое обернули этим выделением с сырым фоном? Что за тег?

Добавлено через 3 минуты
Цитата Сообщение от x_lab Посмотреть сообщение
+(?>\'
Забыл ещё вот что спросить - что вот это означает > в шаблоне регулярного выражения?
0
Невнимательный
2573 / 957 / 314
Регистрация: 08.02.2013
Сообщений: 5,676
Записей в блоге: 2
11.02.2021, 18:06 6
Цитата Сообщение от Onloock Посмотреть сообщение
с сырым фоном? Что за тег?
...
[INLINE]...[/INLINE]
Кнопка INLINE над полем ввода справа )
Цитата Сообщение от Onloock Посмотреть сообщение
> в шаблоне
(?>...)
Это как-бы подмаска (?:...) но иногда слегка оптимальнее
https://www.php.net/manual/ru/... lyonce.php

Однократные подмаски
Как для минимального, так и максимального количества повторений, если последующая часть шаблона терпит неудачу при сопоставлении, происходит повторный анализ повторяемого выражения на предмет того, возможно ли успешное сопоставление всего шаблона при другом количестве повторений. Бывают случаи, когда необходимо изменить описанную логику работы для реализации специфического сопоставления либо оптимизации шаблона (если автор уверен, что других вариантов соответствия нет).
можно было обернуть возможно отсутствую часть и так (?:\'[A-Za-z]+)? и сделать как-то ешё ...
просто показал первое что пришло на ум.
Эт один из нескольких возможных вариантов... не считая небольших как-бы незначительных изменений
,) типа [A-Za-z]++
0
Смотрю книгу вижу фигу
32 / 23 / 11
Регистрация: 12.11.2016
Сообщений: 97
11.02.2021, 23:39  [ТС] 7
x_lab, эти регулярные выражения - ад для меня. Вроде бы насмотрелся символов для регулярок которые в мануале есть, думаешь все, все знаешь. Потом другие примеры смотришь, такое ощущение, как будь-то каждый сам свой синтаксис регулярных выражений придумывает, и он все равно работает - постоянно что-то новое))

Я пытался с помощью preg_replace валидировать имя, оставлять только буквы, удаляя цифры, спецсимволы.
Как бы слово replace другое значение имеет Оно то работает, пока цифры не введешь. Убрать ^ и все - ничего не работает. Для другого эта функция.

Наконец-то preg_match_all начал использовать. Только вот как его заставить работать не понимаю, вот что пытаюсь сделать:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$str = '~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'`Mary`s ~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'`James`s ~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'`Babaykin`s~!@#$%^&*()_+|\/?.><"№;:=-0123456789';
 
    $char_replace = str_ireplace("`", "'", $str);
    preg_match_all('/[^a-zA-ZА-Яа-яҐґЄєІіЇїЁё\s]+(?>\'[^a-zA-ZА-Яа-яҐґЄєІіЇїЁё\s]+)?(*SKIP)(?!)|\'+/ui', $char_replace, $matches);
    
    foreach ($matches as $coincide) {
        foreach ($coincide as $char) {
            echo $char;
        }
    }
?>
Как в переменной $matches получить массив из строки Mary's James's Babaykin's?

Добавлено через 11 минут
Такой шаблон
PHP
1
/[a-zA--Яа-яҐґЄєІіЇїЁё\s]/ui
Дает такой результат
PHP/HTML
1
Marys Jamess Babaykins
Близко, все же - далеко не то

Добавлено через 3 минуты
Цитата Сообщение от Onloock Посмотреть сообщение
ҐґЄєІіЇї
Эти буквы в регулярном выражении для украинского языка, они не верно отображаются, если регулярка их пропустит.
Это регулярное выражение должно пропускать три языка: украинский, русский и английский. Проверял, работает. Вреде бы)
0
Невнимательный
2573 / 957 / 314
Регистрация: 08.02.2013
Сообщений: 5,676
Записей в блоге: 2
12.02.2021, 00:11 8
Лучший ответ Сообщение было отмечено Onloock как решение

Решение

Цитата Сообщение от Onloock Посмотреть сообщение
получить массив из строки
непонятно зачем вложенные foreach... все совпадения вроде должны получится в $matches[0]
... как-бы если например такое
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$str = '~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'`Mary`s ~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'`James`
s ~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'`Babaykin`s~!@#$%^&*()_+|\/?.><"№;:=-0123456789';
 
    $char_replace = str_ireplace("`", "'", $str);
    preg_match_all('/[a-zA-ZА-Яа-яҐґЄєІіЇїЁё]+(?>\'[a-zA-ZА-Яа-яҐґЄєІіЇїЁё]+)?/u', $char_replace,
$matches);
 
    echo '<pre>$matches = ',  var_export($matches, 1), "</pre>";
/*
 
<pre>$matches = array (
  0 =>
  array (
    0 => 'Mary\'s',
    1 => 'James\'s',
    2 => 'Babaykin\'s',
  ),
)</pre>*/
Цитата Сообщение от Onloock Посмотреть сообщение
с помощью preg_replace валидировать имя, оставлять только буквы, удаляя цифры, спецсимволы.
Как-бы есть два пути .)
1. валидация ... это когда просто проверется соответствует-ли полученное значение ожидаемому.
2. фильтрация ... когда что-то не подходящее удалется
... Но на деле иногда приходится немного комбинировать
применяя и первое и второе последовательно наверно ,) как-бы не в ущерб производительности и user-frendly

)) Имею ввиду например пробелы, по краям самоидентификатора юзера, можно смело удалить молча, юзеры поймут...
А насчёт остального как-бы лучше попросить вестит заново, чем молча что-то обрезать/вырезать
0
Смотрю книгу вижу фигу
32 / 23 / 11
Регистрация: 12.11.2016
Сообщений: 97
12.02.2021, 16:24  [ТС] 9
Цитата Сообщение от x_lab Посмотреть сообщение
непонятно зачем вложенные foreach... все совпадения вроде должны получится в $matches[0]
Там ведь двумерный массив
PHP/HTML
1
2
3
array (
  0 =>
  array (
вот как двумерный массив и вывожу двумя циклами foreach
Цитата Сообщение от x_lab Посмотреть сообщение
1. валидация ...
2. фильтрация ...
применяя и первое и второе последовательно наверно ,) как-бы не в ущерб производительности и user-frendly
Я так +/- делаю. Изучая PHP, чем-то нужно подкармливать мотивацию. Например дорабатывать Landing - это самое простое, чтоб что-то заработать на первых порах.

Некоторые заметил особо не парятся о валидации данных при отправке заказов на почту. Пост пришел, присвоили его переменной, отправили - готово.
Цитата Сообщение от x_lab Посмотреть сообщение
например пробелы, по краям самоидентификатора юзера, можно смело удалить молча
Вот даже такое мало кто делает. Я не отфильтрованные POST не отправляю на почту.

Как по мне, клиент должен минимально напрягаться для ввода данных. Две ошибки - можно показать для переввода данных, больше будет уже напряжно (это на один input). Поэтому (на примере поле Имя) я все не нужное МНЕ удаляю, потом валидиция на длину символов в строке (max && min значение).

В итоге две ошибки:
- при проверке на пустоту, которая можно предотвратить еще во-время ввода используя
HTML5
1
<input required>
- и ошибка при некорректной длине имени

Этого возможно мало. Можно на @ проверить, мол Вы ввели email, нужно имя. И еще на что-то проверку.

Номер телефона намного легче валидировать и фильтровать. У него есть несколько известных варианта записи по длине (полная, сокращенная). У номера есть обязательные части, при отсутствии которых до абонента не дозвонится
Это код города, код оператора и основная часть - правда это я за мобильный номер, не за домашний.

Много что-то пишу) Вот как я Имя проверяю:
Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
<?php
$_POST['name'] = '~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'`Mary`s ~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'` James`s 
~!@#$%^&*()_+|\/?.><"№;:=-0123456789\'` Babaykin`s~!@#$%^&*()_+|\/?.><"№;:=-0123456789';
 
function clear_field($data) {
    $data = trim($data);
    $data = stripslashes($data);
    // $data = strip_tags($data);
    return $data;
}
 
function array_to_string($matches) {
    foreach ($matches as $coincide) {
        foreach ($coincide as $char) {
            $result .= $char;
        }
    }
    return $result;
}
    
if (!empty($_POST['name'])) {
 
    preg_match_all('/[a-zA-ZА-Яа-яҐґЄєІіЇїЁё\s]+(?>\'[a-zA-ZА-Яа-яҐґЄєІіЇїЁё\s]+)?/ui', str_ireplace("`", "'", 
    clear_field($_POST['name'])), $name);
    $name = array_to_string($name);
    
    if (mb_strlen($name) >= 2 && mb_strlen($name) <= 65) {
        $success['name'] = $name;
    } else {
        $error = 'Не корректная длина имени';
    }
    
} else {
    $error = 'Не заполнено';
}
 
if (!empty($error)) {
    echo '<div><b>Клиент</b>: ' . $error . '</div>'; 
} else {
    echo '<div><b>Клиент</b>: ' . $success['name'] . '</div>';
}
?>


Работает, вывод:
PHP/HTML
1
Клиент: Mary's James's Babaykin's
Возможно правильно мыслю, возможно нет, когда то пойму)

Добавлено через 12 минут
Спасибо большое!
0
12.02.2021, 16:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2021, 16:24
Помогаю со студенческими работами здесь

Что такое ' ' (апострофы)
Да, я знаю что char c = '1'; // == 48 А вот что такое '1234' и почему нельзя '12345'?

Различаются ли апострофы в Паскале - прямые и наклонные?
Добрый день! У ребенка в методичке от физтеха в программах на паскале встречаются апострофы всех...

Удалить часть символьной строки, заключённой в апострофы
Удалить часть символьной строки, заключённой в апострофы

Как удалить все кавычки и апострофы из документа?
Как удалить все кавычки и апострофы из документа? Я ищу их как '''' и '''' соответственно, а он их...

Надо внести в базу текстовую строку, включающую апострофы
Надо внести в базу текстовую строку, включающую апострофы 'или '. Какие - без разницы. По идее...

Преобразовать строку, заменив все двойные апострофы кавычками.
Дана строка s, содержащая менее чем 200 символов. Преобразовать данную последовательность символов,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru