Как найти и заменить элемент в строке примеры str_replace
Содержание:
- В завершение
- Продвинутая работа со строками
- Замена подстроки
- Простой пример использования функции strpos
- Замена слов в скобках php
- Создание таблицы
- strpos
- Работа с подстроками в PHP
- Особенности стандартного подхода
- Пример использования strpos для поиска вводимого пользователем термина
- Проверка на соответствие критерию
- Основные строковые функции PHP
- Разработка формы
- Поиск подстроки при помощи функции preg_match
- Другие примеры
- SQL-инъекция
- Поиск символа в строке — использование регулярных выражений
В завершение
В сегодняшней статье мы рассмотрели, как сделать поиск по сайту, а также:
- Создавать базы данных и соответствующие таблицы;
- Использовать инструменты для управления базами данных, создавать столбцы и вводить данные;
- Разрабатывать формы поиска на основе PHP, которая умеет осуществлять проверку вводимых данных, наличия переменных в запросе, а также соединяться с базой данных и выводить результаты из таблицы;
- Как защитить приложение и базу данных от SQL-инъекций.
Используя знания, полученные из этой статьи, вы сможете без труда модифицировать чужой код, а также при необходимости расширять функционал формы поиска.
Продвинутая работа со строками
Если вы часто работаете со строками, то возможно вам пригодятся более высокоуровневые методы для их обработки.
Взгляните как будут выглядеть поиск и замена строк с помощью symfony/string:
// checks if the string starts/ends with the given string u('https://symfony.com')->startsWith('https'); // true u('report-1234.pdf')->endsWith('.pdf'); // true // checks if the string contents are exactly the same as the given contents u('foo')->equalsTo('foo'); // true // checks if the string content match the given regular expression u('avatar-73647.png')->match('/avatar-(\d+)\.png/'); // result = // checks if the string contains any of the other given strings u('aeiou')->containsAny('a'); // true u('aeiou')->containsAny(); // false u('aeiou')->containsAny(); // true // finds the position of the first occurrence of the given string // (the second argument is the position where the search starts and negative // values have the same meaning as in PHP functions) u('abcdeabcde')->indexOf('c'); // 2 u('abcdeabcde')->indexOf('c', 2); // 2 u('abcdeabcde')->indexOf('c', -4); // 7 u('abcdeabcde')->indexOf('eab'); // 4 u('abcdeabcde')->indexOf('k'); // null // finds the position of the last occurrence of the given string // (the second argument is the position where the search starts and negative // values have the same meaning as in PHP functions) u('abcdeabcde')->indexOfLast('c'); // 7 u('abcdeabcde')->indexOfLast('c', 2); // 7 u('abcdeabcde')->indexOfLast('c', -4); // 2 u('abcdeabcde')->indexOfLast('eab'); // 4 u('abcdeabcde')->indexOfLast('k'); // null // replaces all occurrences of the given string u('http://symfony.com')->replace('http://', 'https://'); // 'https://symfony.com' // replaces all occurrences of the given regular expression u('(+1) 206-555-0100')->replaceMatches('/++/', ''); // '12065550100' // you can pass a callable as the second argument to perform advanced replacements u('123')->replaceMatches('/\d/', function ($match) { return '.']'; }); // result = ''
Помогла ли Вам эта статья?
Да
Нет
Замена подстроки
Пример: заменим bbb на zzz:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str); echo $result; // результат: aaa zzz ccc zzz ddd
Мы заменили «bbb» на «zzz» и в $result запишется строка «aaa zzz ccc zzz ddd». У нас было 2 вхождения подстроки bbb и мы заменили их на zzz.
А что если нам нужно также заменить и ccc на zzz? Мы бы конечно могли запустить функцию 2 раза, в первый раз заменив первую подстроку, а второй раз другую, но можно просто указать массив подстрок поиска первым параметром.
Пример: заменим bbb и ccc на zzz:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(, 'zzz', $str); echo $result; // результат: aaa zzz zzz zzz ddd
Что если нам нужно заменить bbb на zzz, а ccc на www?
Мы конечно снова можем запустить функцию 2 раза, но оптимальнее с точки зрения производительности будет и вторым параметром передать массив. В первом массиве будут подстроки, которые мы ищем, а во втором те, на которые заменяем.
Пример: заменяем bbb на zzz, а ccc на www:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(, , $str); echo $result; // результат: aaa zzz www zzz ddd
Результат у нас правильный, но читабельность конечно страдает. А представьте если бы мы указывали сразу 50 таких строк для замены? И потом когда мы добавляем или заменяем строку, ее приходилось бы искать в 2 местах.
Более читабельным был бы код:
$str = 'aaa bbb ccc bbb ddd'; $replaces = ; $result = str_replace(array_keys($replaces), array_values($replaces), $str); echo $result; // результат: aaa zzz www zzz ddd
Тут нам помогли функции array_keys и array_values которые вернули все ключи и все значения соответственно.
Кстати для подобной замены вам не обязательно использовать функцию str_replace, а можно воспользоваться strtr, и тогда наш код выглядел бы еще более просто:
$str = 'aaa bbb ccc bbb ddd'; $result = strtr($str, ); echo $result; // результат: aaa zzz www zzz ddd
У функции str_replace также есть четвертый параметр $count, в котором мы ничего не передаем, а наоборот получаем количество вхождений.
Таким образом если дополнить наш пример:
$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str, $count); echo $result; // результат: aaa zzz ccc zzz ddd echo 'Вхождений: ' . $count; // Вхождений: 2
Обязательно прочитайте подробную документацию: https://www.php.net/manual/ru/function.str-replace.php
Простой пример использования функции strpos
Посмотрите следующий пример, в котором я использовал заданные для поиска значения, чтобы продемонстрировать работу функции strpos PHP:
Посмотреть онлайн демо-версию и код
Код PHP
<?php $source_string = 'This is a strpos Tuotrial which is used to search strings. It tells whether a given string contains a search string or not!'; $search_term = 'strpos'; $posistion = strpos($source_string, $search_term); if ($posistion === false) { echo "The source string does not contain the: '$search_term'!"; } else { echo "The string contains the search term: '$search_term'! </BR>"; echo " The given substr found at: $posistion"; } ?>
Замена слов в скобках php
Замена слов в скобках phpВ чем фишка!?Как это работает
Если напишу вот так : php в коде… либо css , то никаких квадратных скобок вы не увидите… смотри скрин ниже:
После обработки php скриптом, это будут обычные ссылки, слова в скобках были заменены на :
В первом случае с php:
<a href=»https://dwweb.ru/page?tema=PHP» target=»_blank»>php</a>
Во втором случае с css:
<a href=»https://dwweb.ru/page?tema=CSS» target=»_blank»>css</a>
Таких слов огромное количество и естественно, что запомнить их все невозможно, поэтому у меня есть кнопка, которая выводит все эти слова в других кнопках, и достаточно кнопку нажать — она вставляется с помощью скрипта js.
Эту картинку, скриншот, можно увеличить в отдельном окне нажмите по нему!здесь мелькает эта панельПродолжение:
Поскольку довольно редкий поисковый запрос… напишите — вам интересен этот скрипт?!
Создание таблицы
Наша таблица должна быть создана в следующем формате:
Column Name | Data Type | Length | Null or Not Null | Primary key? | Auto Increment |
ID | INT | 1 | Not Null | Yes | Yes |
FirstName | Varchar | 50 | Not Null | No | No |
LastName | Varchar | 50 | Not Null | No | No |
Varchar | 50 | Not Null | No | No | |
PhoneNumber | Varchar | 15 | Not Null | No | No |
Таблица базы данных состоит из столбцов и строк, как в Excel. Первый столбец позволяет идентифицировать данные по имени. Далее идет колонка Data types (тип данных), которая указывает нам на тип данных, содержащихся в колонке. В поле Length (Длина) указывается максимальный объем памяти (хранилища) для столбца таблицы. Мы используем переменные, которые дают больше гибкости. Другими словами, если длина ФИО меньше 50 символов, то будет занята лишь часть отведенного места.
И среди данных персонала не может быть пустых значений (null, empty). Первая строка выделена желтым цветом, потому что столбец ID – наш основной ключ. Основной ключ в базе данных гарантирует, что каждая запись будет уникальной. К этой колонке также применен автоинкремент, а это значит, что каждой записи в нашей базе данных будет присваиваться уникальный номер автоматически.
strpos
Находит позицию первого вхождения подстроки в заданной строке.
Синтаксис:
int strpos(string where, string what )
Функция strpos() пытается найти в строке where подстроку what и в случае успеха возвращает позицию (индекс) этой подстроки в строке. Первый символ строки имеет индекс 0. Необязательный параметр fromwhere можно задавать, если поиск нужно вести не с начало строки, а с какой-то другой позиции. В этом случае следует эту позицию передать в fromwhere. Если подстроку не удалось найти, функция возвращает false.
Если параметр what не строка, в этом случае его значение преобразуется в целое и используется как код искомого символа.
if(strpos($text, "a")===false) echo "Не найдено!"; // Проверка: три знака равенства
Работа с подстроками в PHP
Функция substr(строка, число1, число2) возвращает подстроку, начинающуюся с позиции число1 и длиной число2. Попробуйте выполнить код:
echo substr("Hello, world!", 2, 4);
Первый параметр — это исходная строка. Второй параметр — начало подстроки, а третий параметр (он н еобязательный) — длина подстроки. Если третий параметр не задан, то подстрока возвращается до конца исходной строки.
$sub = substr("машина", 4); //возвращает "на" $sub = substr("машина", 2, 4); //возвращает "шина"
Очень мощной является функция explode(), позволяющая извлечь все подстроки, разделенные разделителем. Предположим, что у нас есть вот такая строка: «Строка1;Строка2;Строка3».
$str = "Строка1;Строка2;Строка3";
При вызове explode() мы должны указать два параметра: разделитель и исходная строка.
$A = explode(";", $str);
Функция возвращает список, содержащий наши строки.
Array ( => Строка1 => Строка2 => Строка3 )
На этом пока все, но в PHP есть и другие полезные строковые функции, которые активно применяются веб-программистами на практике. О них я обязательно расскажу в одной из своих новых статей.
Особенности стандартного подхода
Если поиск подстроки в строке PHP не имеет результата: искомого нет, и результат будет логическим значением. Однако если искомая подстрока начинается с нулевой позиции, то это следует выделить особо в операциях сравнения и анализа результата. Когда результат равен 0 — это ненамного отстоит дальше от результата false.
В отличие от JavaScript, в отношении строк PHP более консервативен, и для него по сей день строки — это строки. Работа с ними — это строчные функции: от простых уровня strpos до сложных, использующих регулярные выражения.
Искать нужно, чтобы:
- принять решение о направлении алгоритма;
- заменить искомое на другое;
- проверить событие;
- увеличить счетчик статистики и пр.
Это привычная логика алгоритма, JavaScript пошел дальше и признал «строки» объектами. Но одного признания на практике мало. Если абстрагироваться от понятия «строка» и понимать под ним реальный объект, вопрос «поиск строки в строке» PHP позволит сформулировать в контексте реального метода, например, яблоко может быть спелым, не только когда оно красное.
Классический поиск слова «красное» в описании яблока не есть гарантия достоверного ответа о спелости фрукта. Если яблоко представлено не строкой, а объектом, то поиск строки в строке PHP выполнит не как strpos, а как метод реального объекта. При этом нет никакой гарантии, что в теле метода будет использоваться именно функция strpos.
Пример использования strpos для поиска вводимого пользователем термина
Этот метод может оказаться полезным в определенных сценариях. Например, когда в форму не разрешается вводить определенные слова.
Кроме этого можно проверить, содержится ли слово, заданное пользователем на поиск, в исходной строке. Исходя из этого, можно вывести определенные результаты в виде ответа.
В этой демо-версии, пользователь может ввести термин в текстовое поле. После нажатия кнопки запускается функция strpos, чтобы проверить, содержит ли исходная строка подстроку. На экран будет выводиться соответствующее сообщение:
Для демо-версии я использовал следующую исходную строку:
$source_string = 'In this demo, I am using a user entered search term to check if string contains search term or not by using strpos!';
Попробуйте ввести разные буквы или слова для поиска, чтобы проверить вернет ли функция значение false. Кроме этого попробуйте ввести термины заглавными или маленькими буквами, чтобы увидеть разницу.
Для этого был использован следующий пример PHP strpos utf 8:
<?php $search_term=$_POST; $source_string = 'In this demo, I am using a user entered search term to check if string contains search term or not by using strpos!'; // = 'strpos'; $posistion = strpos($source_string, $search_term); if( $search_term ){ echo "<div class='result'>"; if ($posistion === false) { echo "The source string does not contain the: '$search_term'!"; } else { echo "The string contains the search term: '$search_term'! </BR>"; echo " The given substring found at: $posistion"; } echo "</div>"; } ?>
Также можете посмотреть разметку strpos PHP примера:
<!doctype html> <html> <head> <style> .result { background: #5BB75B; height: auto; width:220px; border-radius: 15px; padding:20px; font-size:20px; color:#000; } .searchterm{ background: #6A0432; width:220px; border-radius: 15px; padding:20px; font-size:18px; color:#fff; } </style> <div class="searchterm"> <form method="post" action=""> <label>Enter a string:</label><input type="text" name="searchterm"> <input type="submit"/> </form> </div> </body> </html>
Полную версию можно увидеть в исходном коде страницы демо-версии.
Кроме этого вы можете использовать в качестве источника базу данных для создания системы поиска на своем сайте.
Проверка на соответствие критерию
Когда пользователь вводит имя или фамилию, а затем нажимает кнопку подтверждения, форма передает данные самой себе и добавляет в конце строку запроса “go”. На данном этапе мы проверяем наличие строки запроса go. Если результат положительный, выводим результаты поиска.
До вывода запрашиваемых результатов нам нужно перепроверить: (1) была ли подтверждена форма, (2) содержит ли строка запроса значение go, (3) был ли поисковой запрос введен в нижнем или верхнем регистре? Если ни одна из проверок не дает положительного результата (true), то от нас не требуется выполнять какие-либо действия.
Для начала добавим небольшой блок кода PHP поиск по сайту после закрывающего тега </form>:
</form> <?php //сделать что-то в коде ?> </body> </html>
Сначала мы открываем блок PHP-кода тегом ””.
Любой PHP-код внутри этой пары тегов будет исполняться сервером. Затем мы проверяем, была ли подтверждена форма:
<?php if(isset($_POST)){ // сделать что-то в коде } else{ echo "<p> Введите поисковый запрос</p>"; } ?>
Мы воспользуемся встроенной функцией isset, которая возвращает значение типа bool, и поместим в нее массив $_POST. Логическое выражение в программировании позволяет получить нам либо true, либо false.
Следовательно, если функция возвращает значение true, то форма была подтверждена, и нам нужно продолжить выполнение кода дальше. Если же функция возвращает значение false, то мы выведем сообщение об ошибке. Сохраните весь набранный код в файле search_submit.php.
Далее нам нужно проверить, имеется ли в строке запроса значение go:
<?php if(isset($_POST)){ if(isset($_GET)){ else{ echo "<p> Введите поисковый запрос</p>"; } } } ?>
Мы вкладываем еще одно условное логическое выражение внутрь основного, но только в этот раз мы используем массив $_GET вместе со значением “go”. Сохраните изменения в файле search_go.php.
Теперь нам нужно убедиться, что посетители могут вводить первую букву в строку запроса только в верхнем или только в нижнем регистре. Нам также нужно предусмотреть способ учета критериев поиска, введенных посетителем. Лучше всего проверять введенные посетителем данные с помощью регулярного выражения:
<?php if(isset($_POST)){ if(isset($_GET)){ if(preg_match("^/+/", $_POST)){ $name=$_POST; } } else{ echo "<p>Пожалуйста, введите поисковый запрос</p>"; } }?>
Мы вкладываем еще одно условное логическое выражение внутрь наших двух. На этот раз мы используем регулярное выражение для проверки ввода. Мы используем встроенную функцию preg_match с двумя параметрами: регулярное выражение, и поле формы, к которому должна применяться проверка.
В нашем случае, это будет поле «Имя» (name). Чтобы извлечь параметры поиска, указанные посетителем, мы создаем переменную $name, и привязываем к ней значение POST с названием поля из формы, которое будет использоваться в SQL-запросе. Сейчас мы реализовали: (1) отправку данных формы, (2) строка запроса включает значение go и (3) посетитель ввел либо заглавную, либо строчную первую букву. И все эти проверки происходят еще до внесения изменений в базу данных. Сохраните все изменения.
Основные строковые функции PHP
Перечень полезных строковых функций PHP удобнее всего представить в виде таблицы. Функции приводятся без параметров — просто название функции и ее краткое описание. Далее мы рассмотрим некоторые из этих функций отдельно.
Функция | Описание |
---|---|
chop() | Удаляет пробельные символы в конце строки |
convert_cyr_string() | Используется для преобразования кодировок русского языка |
explode() | Выделяет подстроки (поля) из строки |
HtmlSpecialChars() | Заменяет специальные символы их HTML-эквивалентами, например < будет заменено эквивалентом < |
ltrim() | Похожа на trim(), но удаляет пробельные символы только в начале строки |
md5() | Кодирует указанную строку с помощью алгоритма MD5 |
nl2br() | Заменяет все символы новой строки (\п) тегом . Очень полезная функция в веб-программировании |
pack() | Запаковывает бинарные данные |
str_replace() | Используется для замены в строке |
strcasecmp() | To же, что и предыдущая функция, но производит сравнение без учета регистра символов |
strcmp() | Используется для сравнения строк |
strip_tags() | Удаляет все HTML-теги из строки |
strlen() | Определяет длину строки |
strpos() | Производит поиск подстроки в строке |
strtolower() | Преобразует все символы строки в нижний регистр |
strtoupper() | Преобразует все символы строки в верхний регистр |
substr() | Возвращает определенную подстроку |
trim() | Функция помогает избавиться от пробельных символов в начале и в конце строки |
unpack() | Распаковывает бинарные данные |
urldecode() | Раскодирует строку, которая была ранее закодирована с помощью urlencode() |
urlencode() | Кодирует строку для ее передачи в URL (символы, которые не могут быть представлены в URL, например символы русского языка, заменяются их кодами) |
wordwrap() | Используется для разбивки текста |
Разработка формы
Чтобы создать форму поиска по сайту через , откройте любой подходящий текстовый редактор. Я рекомендую воспользоваться бесплатным PSPad. Вы можете использовать любой текстовый редактор, где предусмотрена подсветка синтаксиса. Это в значительной степени облегчит процесс написания и отладки PHP-кода. Создавая страницу для формы поиска, не забудьте сохранить ее в формате .php, иначе PHP-код не будет обрабатываться должным образом. Как только сохраните документ, скопируйте в него следующую разметку:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Поиск контактов:</title> </head> <p><body> <h3>Детальный поиск контактов</h3> <p>Вы можете искать по имени или фамилии</p> <form method="post" action="search.php?go" id="searchform"> <input type="text" name="name"> <input type="submit" name="submit" value="Search"> </form> </body> </html> </p>
Если вы знакомы с языком HTML, то тут вам все должно быть понятно как минимум до открывающего тега form. Внутри этого тега находится важнейший элемент всего кода – атрибут action. В качестве действия нашей формы мы указали название нашего файла, а затем применили к нему строку запроса “go”.
Поиск подстроки при помощи функции preg_match
Эта функция производит поиск подстроки при помощи регулярного выражения.
Регулярное выражение — это шаблон, который сравнивается со строкой. Под один шаблон может подходить сразу множество разных строк.
Они пригодятся если вам нужно производить поиск не по конкретной подстроке, а найти все строки, обладающие свойствами, описанными при помощи регулярного выражения. Знание этой темы сильно расширяет ваши возможности в работе со строками.
Функция PHP strpos
используется для поиска подстроки в заданной строке. Она возвращает числовое значение первого вхождения заданной на поиск подстроки.
Другие примеры
Рассмотрим еще несколько примеров:
// Порядок замены $str = "Строка 1\nСтрока 2\rСтрока 3\r\nСтрока 4\n"; $order = array("\r\n", "\n", "\r"); $replace = '<br />'; // Обрабатывает сначала \r\n для избежания их повторной замены. echo $newstr = str_replace($order, $replace, $str); // Выводит F, т.к. A заменяется на B, затем B на C, и так далее... // В итоге E будет заменено F, так как замена происходит слева направо. $search = array('A', 'B', 'C', 'D', 'E'); $replace = array('B', 'C', 'D', 'E', 'F'); $subject = 'A'; echo str_replace($search, $replace, $subject); // Выводит: яблорехкорех орех (по вышеуказанной причине) $letters = array('я', 'о'); $fruit = array('яблоко', 'орех'); $text = 'я о'; $output = str_replace($letters, $fruit, $text); echo $output;
Эта функция не поддерживает регулярные выражения, но для этого есть другая функция: preg_replace()
SQL-инъекция
Причина, по которой мы добавили в наше поле поиска регулярное выражение, заключается в том, чтобы никто не смог вмешаться в наш SQL-запрос. Раньше эта проблема была распространена, и хакеры умудрялись проводить собственные SQL-запросы, манипулируя при этом вашим приложением. Например, если бы мы допустили возможность использовать апостроф в нашем поле, то хакер мог бы просто удалить базу данных, используя запрос:
'DROP TABLE <myTable>
Как уже было отмечено, регулярное выражение гарантирует, что в качестве первого символа посетитель может вводить лишь буквы в нижнем или верхнем регистре.
Поиск символа в строке — использование регулярных выражений
Также для поиска можно использовать регулярные выражения. Они лучше подходят для случаев, когда вы ищете в строке более сложные конструкции.
Но помните, что функция strpos() работает в три раза быстрее, чем регулярные выражения. Следующий пример демонстрирует, как с их помощью найти слово, символ в строке:
$the_string = "Я на 5 лет старше тебя."; $the_word = "лет"; $the_character = "Я"; $the_substring = "5 лет"; // Вывод — Слово "лет" есть в данной строке. if (preg_match('/лет/', $the_string)) { echo 'Слово "'.$the_word.'" есть в данной строке.'; } // Вывод — Символ "Я" есть в данной строке. if (preg_match('/Я/', $the_string)) { echo 'Символ "'.$the_character.'" есть в данной строке.'; } // Вывод — Подстрока "5 лет" есть в данной строке. if (preg_match('/5 лет/', $the_string)) { echo 'Подстрока "'.$the_substring.'" есть в данной строке.'; }
Использование функции preg_match() имеет смысл только при сложном поиске. Например, для проверки того, содержит ли строка слова с десятью и более символами и т.п. Пример:
$the_string = 'Фотосинтез и рискованный – длинные слова.'; // Вывод — Данная строка содержит слова из 10 и более символов. if (preg_match('/w{10,}/i', $the_string)) { echo 'Данная строка содержит слова из 10 и более символов.'; }
Чтобы сделать поиск регистронезависимым, добавьте флаг i в конец шаблона. Пример реализации:
$the_string = "Ваня любит и яблоки, и апельсины."; $the_word = "ваня"; $the_character = "Я"; $the_substring = "ЛЮбИт И"; // Вывод — Слово "ваня" есть в данной строке. if (preg_match('/ваня/i', $the_string)) { echo 'Слово "'.$the_word.'" есть в данной строке.'; } // Вывод — Символ "Я" есть в данной строке. if (preg_match('/Я/i', $the_string)) { echo 'Символ "'.$the_character.'" есть в данной строке.'; } // Вывод — Подстрока "ЛЮбИт И" есть в данной строке. if (preg_match('/ЛЮбИт И/i', $the_string)) { echo 'Подстрока "'.$the_substring.'" есть в данной строке.'; }