Функция strpos в php: определение позиции подстроки

Замена слов в скобках 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.

Эту картинку, скриншот, можно увеличить в отдельном окне нажмите по нему!здесь мелькает эта панельПродолжение:

Поскольку довольно редкий поисковый запрос… напишите — вам интересен этот скрипт?!

Использование регулярных выражений для поиска точного вхождения слова

Функции strpos() и stripos()работают быстрее, чем регулярные выражения. Но их использование для поиска точного вхождения слова может быть проблематичным.

В подобных ситуациях лучше применять регулярные выражения. Можно использовать выражение b в шаблоне регулярного выражения, чтобы обозначить границу слова. Если слово, которое вы ищете, заключено в выражения b, функция preg_match() найдёт только точные вхождения слова и вернет FALSE для частичных совпадений. Вот пример:

$the_string = 'Фотосинтез и рискованный – длинные слова.';
$the_word = 'синтез';

// Вывод — Слово "синтез" имеет точное совпадение в данной строке. 
if (preg_match('/синтез/', $the_string)) {
  echo 'Слово "синтез" имеет точное совпадение в данной строке. ';
}

// Вывод — Слово "синтез" имеет точное совпадение в данной строке. 
if (strpos($the_string, $the_word)) {
  echo 'Слово "синтез" имеет точное совпадение в данной строке. ';
}

// Вывод — Слово "синтез" не имеет точных совпадений в данной строке. 
if (preg_match('/bсинтезb/', $the_string)) {
  echo 'Слово "синтез" имеет точное совпадение в данной строке. ';
} else {
  echo 'Слово "синтез" не имеет точных совпадений в данной строке. ';
}

Как заменить один элемент строки!?

У нас есть некая строка, в которой требуется найти какой-то элемент и заменить его на другой!

Здесь текст с нижним тире_, которое_ надо заменить на обыкновенное —

Мы воспользуемся функцией str_replace

Для этой функции и множества аналогичных нужно запомнить, что внутри неё…

Я запомнил так: str_replace(«ЧТО»,»НА ЧТО»,»ГДЕ»);

Нам потребуется переменная…

$переменная = «Здесь текст с нижним тире_, которое_ надо заменить на обыкновенное -«;

Замена str_replace будет иметь такой вид:

$переменная = str_replace(«_»,»-«, $переменная);

Результат:

Как видим наше подчеркивание заменилось удачно!

Здесь текст с нижним тире-, которое- надо заменить на обыкновенное —

Работа со строками

Последнее обновление: 1.11.2015

Строки играют большую роль, задачи на парсинг строк довольно часто встречаются в PHP , поэтому рассмотрим некоторые базовые функции работы со строками.
Но прежде чем начать работу со строками, откроем файл php.ini и найдем в нем следующую строку:

;extension=mbstring

Раскомментируем ее, убрав точку с запятой. И так как у нас файл php.ini изменился, перезапустим веб-сервер Apache.

Подключение расширения mbstring позволит задействовать некоторые дополнительные функции для работы со строками, которые
в стандартном наборе PHP отсутствуют.

Функции strpos() и mb_strpos()

Функция возвращает позицию подстроки или символа $search в строке $str или значение , если
строка $str не содержит подстроки $search:

$input = 'This is the end'; 
$search = 'is';
$position = strpos($input, $search); // 2
if($position!==false)
{
	echo "Позиция подстроки '$search' в строке '$input': $position";
}

При использовании этой функции надо учитывать, что индексация символов в строке начинается с нуля, поэтому позиция символа ‘T’ будет равна 0.
Поэтому сравнение будет работать некорректно, ведь false и 0 при сравнении и приведении к общему типу будут представлять одно и то же значение.
Поэтому в данном случае корректно использовать только операцию эквивалентности: или .

Теперь применим функцию на другом примере:

$input = 'Мама мыла раму'; 
$search = 'мы';
$position = strpos($input, $search); // 9

Неожиданно, но результатом функции будет число 9. Хотя мы видим, что истинная позиция подстроки ‘мы’ в исходной строке равна 5.

Все дело в том, что некоторые строковые функции не всегда корректно обрабатывают кириллические символы, и для них лучше использовать другую функцию —
mb_strpos():

$position = mb_strpos($input, $search); // 5 

Функция strrpos()

Функция strrpos() во многом аналогична функции , только ищет позицию не первого, а последнего вхождения подстроки в строку:

$input = 'This is the end'; 
$search = 'is';
$position = strpos($input, $search); // 5

Но опять же данная функция не совсем корректно работает с кириллическими символами, поэтому нам надо использовать ее аналог — mb_strrpos():

$position = mb_strrpos($input, $search);

Функция trim()

Функция удаляет из строки начальные и конечные пробелы, а также управляющие символы ‘\n’, ‘\r’, ‘\t’:

$input = '  Мама мыла раму  ';
$input = trim($input);

Изменение регистра

Для перевода строки в нижний регистр используется функция strtolower:

$input = 'The World is Mine';
$input = strtolower($input);

Для перевода в нижний регистр строки с кириллическими символами можно использовать функцию mb_strtolower:

$input = mb_strtolower($input);

Для перевода строки в верхний регистр примеяются функции strtoupper()/mb_ strtoupper(),
которые работают аналогично.

Функция strlen()

Функция strlen() возвращает длину строки, то есть количество символов в ней:

$input = 'Hello world';
$num = strlen($input);
echo $num;

Функция strlen() также некорректно работает с кириллицей, поэтому в этом случае лучше применять функцию mb_strlen():

$input = 'Мама мыла раму';
$num = mb_strlen($input);
echo $num;

Получение подстроки

Применяя функцию , можно получить из одной строки ее определенную часть. Данная функция обрезает строку $str,
начиная c символа в позиции $start до конца строки. С помощью дополнительного необязательного параметра $length можно задать количество вырезаемых символов.

$input = 'The world is mine!'; 
$subinput1 = substr($input, 2);
$subinput2 = substr($input, 2, 6);
echo $subinput1;
echo "<br />";
echo $subinput2;

Так как данная функция некорректно работает с кириллицей, то вместо нее следует применять функцию mb_substr(),
которая действует аналогично:

$input = 'Мама мыла раму'; 
$subinput1 = mb_substr($input, 2);
$subinput2 = mb_substr($input, 2, 6);

Замена подстрок

Для замены определенной части строки применяется функция . Эта функция заменяет в строке $input все
вхождения подстроки $old на подстроку $new с учетом регистра:

$input = 'Мама мыла раму'; 
$input = str_replace("мы", "ши", $input);
echo $input;

НазадВперед

Создание таблицы

Наша таблица должна быть создана в следующем формате:

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
Email Varchar 50 Not Null No No
PhoneNumber Varchar 15 Not Null No No

Таблица базы данных состоит из столбцов и строк, как в Excel. Первый столбец позволяет идентифицировать данные по имени. Далее идет колонка Data types (тип данных), которая указывает нам на тип данных, содержащихся в колонке. В поле Length (Длина) указывается максимальный объем памяти (хранилища) для столбца таблицы. Мы используем переменные, которые дают больше гибкости. Другими словами, если длина ФИО меньше 50 символов, то будет занята лишь часть отведенного места.

И среди данных персонала не может быть пустых значений (null, empty). Первая строка выделена желтым цветом, потому что столбец ID – наш основной ключ. Основной ключ в базе данных гарантирует, что каждая запись будет уникальной. К этой колонке также применен автоинкремент, а это значит, что каждой записи в нашей базе данных будет присваиваться уникальный номер автоматически.

В завершение

В сегодняшней статье мы рассмотрели, как сделать поиск по сайту, а также:

  • Создавать базы данных и соответствующие таблицы;
  • Использовать инструменты для управления базами данных, создавать столбцы и вводить данные;
  • Разрабатывать формы поиска на основе PHP, которая умеет осуществлять проверку вводимых данных, наличия переменных в запросе, а также соединяться с базой данных и выводить результаты из таблицы;
  • Как защитить приложение и базу данных от SQL-инъекций.

Используя знания, полученные из этой статьи, вы сможете без труда модифицировать чужой код, а также при необходимости расширять функционал формы поиска.

Данная публикация является переводом статьи «How to Create a Search Feature with PHP and MySQL» , подготовленная редакцией проекта.

Поиск по буквам

Для реализации поиска по буквам потребуется лишь несколько дополнительных строк кода. Добавим этот удобный функционал для посетителей. Таким образом, они смогут находить представителей персонала по буквам, которые содержатся в имени или фамилии.

Добавьте следующую строку кода после закрывающего тега form:

</form> 
<p><a  href="?by=A">A</a> | <a  href="?by=B">B</a> | <a  href="?by=K">K</a></p> 
<?php

Мы привязываем тег <a> к строке запроса с by с помощью анкора, и устанавливаем его равным определенной букве. Чтобы реализовать функционал поиска по буквам, нам нужно добавить следующий код прямо после закрывающей фигурной скобки в исходном скрипте, как показано ниже:

}//Окончание скрипта поисковой формы 
if(isset($_GET)){ 
$letter=$_GET; 
//Подключение к базе данных 
$db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как: ' . mysql_error()); 
//-Выберете базу данных 
$mydb=mysql_select_db("yourDatabase"); 
//-Запрос к таблице базы 
$sql="SELECT  ID, FirstName, LastName FROM Contacts WHERE FirstName LIKE '%" . $letter . "%' OR LastName LIKE '%" . $letter ."%'"; 
//-Запустить запрос к функции MySQL Query
$result=mysql_query($sql); 
//-Результаты подсчета
$numrows=mysql_num_rows($result); 
echo  "<p>" .$numrows . " results found for " . $letter . "</p>"; 
//-Запуск цикла и сортировка результатов 
while($row=mysql_fetch_array($result)){ 
$FirstName  =$row; 
            $LastName=$row; 
            $ID=$row; 
//-Вывести результат в массиве
echo  "<ul>n"; 
echo  "<li>" . "<a  href="search.php?id=$ID">"   .$FirstName . " " . $LastName .  "</a></li>n"; 
echo  "</ul>"; 
} 
}

Здесь мы изменили четыре фрагмента кода скрипта поиска по сайту:

  • Мы используем функцию isset(), и вносим в нее массив $_GET, а затем проверяем значение by;
  • Создаем переменную $letter и инициализируем ее значение массивом $_GET;
  • Добавляем переменную letter в SQL-запрос;
  • Указываем переменную letter внутри выражения, в котором получаем подсчитанное количество строк.

Сохраните файл search_byletter.php и проверьте результат.

Поиск определенного сотрудника

Чтобы отобразить информацию об остальном персонале, которая передается через уникальное id внутри нашей ссылки, нужно добавить следующий код прямо после закрывающей фигурной скобки в скрипте letter, как показано ниже:

}//Окончание скрипта 
if(isset($_GET)){ 
$contactid=$_GET; 
//Подключение к базе данных 
$db=mysql_connect  ("servername", "username",  "password") or die ('Я не могу подключиться к базе данных, так как: ' . mysql_error()); 
//-select  the database to use 
$mydb=mysql_select_db("yourDatabase"); 
//- Запрос к таблице базы данных
$sql="SELECT  * FROM Contacts WHERE ID=" . $contactid; 
//- Запустить запрос к функции mysql_query()
$result=mysql_query($sql); 
//- Запуск цикла и сортировка результатов
while($row=mysql_fetch_array($result)){ 
  $FirstName =$row; 
            $LastName=$row; 
            $PhoneNumber=$row; 
            $Email=$row; 
//- Вывести результат в массиве
echo  "<ul>n"; 
echo  "<li>" . $FirstName . " " . $LastName .  "</li>n"; 
echo  "<li>" . $PhoneNumber . "</li>n"; 
echo  "<li>" . "<a href=mailto:" . $Email .  ">" . $Email . "</a></li>n"; 
echo  "</ul>"; 
} 
}

Здесь мы изменили четыре фрагмента кода:

  • Мы используем функцию isset(), и с ее помощью проверяем значение ID в массиве $_GET;
  • Создаем переменную $contactid и инициализируем ее массивом $_GET;
  • В таблице выделяем все, что отмечено звездочкой *. Звездочка – это сокращенное обозначение в SQL, которое означает «дайте мне все столбцы и строки из таблицы». Чтобы определить, какую информацию выводить, мы упоминаем переменную contactid в конце SQL-выражения;
  • Выводим дополнительную информацию о каждом представителе персонала.

Сохраните файл search_byid.php и проверьте результат.

Обратите внимание, что наш функционал работает так, как и положено. При вводе имени или фамилии в поле, или при выборе буквы в качестве гиперссылки, отображаются только имена представителей персонала

Если навести курсор на ссылку, то в строке статуса можно увидеть уникальный ID. Если кликнуть по конкретному человеку, то адресная строка изменится, и отобразится дополнительная информация об этом сотруднике.

Проверка на соответствие критерию

Когда пользователь вводит имя или фамилию, а затем нажимает кнопку подтверждения, форма передает данные самой себе и добавляет в конце строку запроса “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) посетитель ввел либо заглавную, либо строчную первую букву. И все эти проверки происходят еще до внесения изменений в базу данных. Сохраните все изменения.

Заменить N-ый символ на любое количество знаков.

Если вы не ответили на вопрос, почему нельзя заменить один символ на несколько символов, то ответ простой! Символ можно заменить только на 1 символ! Иначе структура переменной поломается… и замену не увидите, и все, что после этого символа, вместе с символом…

А если нужно N-ый символ строки заменить на слово!?

На предложение и т.д… да на что угодно…

Легко!

Разобьем(explode) строку в массив, по тому символу, который хотим заменить :

$TEXT_EX = explode($NEW_TEXT,$NEW_TEXT);

Соединим(implode) массив в строку, в первое значение помещаем все то, на что хотим заменить. Либо туда переменную.

$TEXT_EX = implode(‘ <red>Здесь любой текст, любой длины</red> ‘, $TEXT_EX);

Смотрим результат…
Hello Здесь любой текст, любой длины world!

Вас может еще заинтересовать список тем : #PHP | #PHP_FUNCTION | #PHP_STRING | #SEARCH | #PHP_BOOK | Последняя дата редактирования : 13.12.2020 22:53
Название скрипта :Php поиск и замена в строке

Скрипт № 33.5Ссылка на скачивание : Все скрипты на

//dwweb.ru/comments_1_5/include/img/hand_no_foto.png
no
no

15/10/2020 11:14 Майя …Пожаловаться
🞨
По умолчанию, текст при блокировке:
Комментарий заблокирован администратором сайта
Для изменения текста блокировки введите новый текст ниже:
Заблокировать

Добрый день, не могли бы вы подсказать, как выделить только первое или, например , только второе одинаковое слово в тексте, очень нужно. Заранее спасибо

Ответить

15/10/2020 03:16 Марат…Пожаловаться
🞨
По умолчанию, текст при блокировке:
Комментарий заблокирован администратором сайта
Для изменения текста блокировки введите новый текст ниже:
Заблокировать

Здравствуйте. Первое, что на ум пришло по вашему вопросу:

Ответить

Как заменить слово/слова в Php

Для того, чтобы заменить слово в тексте нам потребуется некий текст с некими словами, и желательно, чтобы это слово повторялось несколько раз! И если это слово будет найдено, то покрасим в какой-то цвет! А давайте вот этот текст, в котором и идет речь о замене слова, покрасим данное слово в красный цвет!(если вы не поняли, то он кричит — «это гениально!!!»)

И тут внимание!Интересно!?$search$search_1 = array(«слово»,»слова»);

Далее нам потребуется массив, на который будем менять… слова будут те же. но вот мы обернем их в цвет…

$replace_1 = array(«<span style=\»color: red\»>слово</span >»,»<span style=\»color: #1b00ff;\»>слова</span>»);

Ну и собственно текст, где и будем менять массив на массив:

$subject_1 = «Для того, чтобы заменить слово в тексте нам потребуется некий текст с некими словами, и желательно, чтобы это слово повторялось несколько раз! И если это слово будет найдено, то покрасим в какой-то цвет! А давайте вот этот текст, в котором и идет речь о замене слова, покрасим данное слово в красный цвет!, а все слова, которые будут иметь в совсем составе слово «слова» , будут покрашены в синий «;

И выведем прямо здесь нашу замену слова:

echo str_replace($search_1, $replace_1, $subject_1 );

Найти первое повторяющееся слово и выделить его

Условие задачи:

Требуется найти в тексте первое повторяющиеся слово и подчеркнуть его(выделить).

Предположим, что вам нужно найти первое повторяющееся слово в тексте и его же нужно подчеркнуть!

Создадим сразу несколько переменных с разным текстом:

$text = ‘This is do a test — «do do do»‘;
$text_1 = ‘Это тестовый текст в котором есть повторяющееся слово текст’;
$text_2 = ‘Это слово и тестовый текст в котором есть повторяющееся слово и слово текст’;
$text_3 = ‘Это слово и тестовый текст в котором есть повторяющееся слово и слово это текст ‘;

Разбиваем текст по пробелу с помощью explode

$ex = explode(‘ ‘, $thetext);

Далее нам потребуется два цикла. Внутри второго чикла пишем условие, если слово в массиве будет повторяться, то создаем счетчик, по имени слова:

$$ex ++;

Далее следующее условие, если счетчик будет равен 2, то прерываем цикл :

break;

Соберем циклы:

$ex = explode(‘ ‘, $thetext);
for ($i = 0; $i < count($ex); $i++)
{
   for ($j = 0; $j < count($ex); $j++)
   {
       if ( my_strtolower($ex) == my_strtolower( $ex) )
       {
           $$ex ++;
           if($$ex ==2) {$the_word = my_strtolower( $ex ); break;}
       }
   }
   if($the_word){break;}
}

Создаем третий цикл, в котором, как только встретится слово найденное в предыдущих двух циклах, то сразу его выделим цветом слово в массиве с помощью тега

for ($d = 0; $d
{
  if( my_strtolower( $ex ) == $the_word) { $ex = ‘<mark>’.$ex.'</mark>’; break; }
}

Далее Измененный массив преобразуем в строку:

implode(‘ ‘, $ex);

Запакуем это все в функцию :

function find_first($thetext)
{
$ex = explode(‘ ‘, $thetext);
for ($i = 0; $i < count($ex); $i++)
{
   for ($j = 0; $j < count($ex); $j++)
   {
       if ( my_strtolower($ex) == my_strtolower( $ex) )
       {
           $$ex ++;
           if($$ex ==2) {$the_word = my_strtolower( $ex ); break;}
       }
   }
   if($the_word){break;}
}
for ($d = 0; $d < count($ex); $d++)
{
      if( my_strtolower( $ex ) == $the_word) { $ex = ‘<mark>’.$ex.'</mark>’; break; }
}
return implode(‘ ‘, $ex);
}

Выведем результаты, нахождения первого повторяющегося слова в тексте :

echo find_first($text);
echo ‘<br>’;
echo find_first($text_1);
echo ‘<br>’;
echo find_first($text_2);
echo ‘<br>’;
echo find_first($text_3);

SQL-инъекция

Причина, по которой мы добавили в наше поле поиска регулярное выражение, заключается в том, чтобы никто не смог вмешаться в наш SQL-запрос. Раньше эта проблема была распространена, и хакеры умудрялись проводить собственные SQL-запросы, манипулируя при этом вашим приложением. Например, если бы мы допустили возможность использовать апостроф в нашем поле, то хакер мог бы просто удалить базу данных, используя запрос:

'DROP  TABLE <myTable>

Как уже было отмечено, регулярное выражение гарантирует, что в качестве первого символа посетитель может вводить лишь буквы в нижнем или верхнем регистре.

Как заменить несколько элементов строки!?

Чем еще замечательна функция str_replace – тем, что она умеет заменять не только один элемент строки, но и несколько!

Почему я решил сегодня написать эту страницу… вчера у меня задача стояла заменить в строке несколько элементов например:

ссылке

Чтобы сто раз не повторять поместим её в переменную — она нам понадобится…

$url = «https://dwweb.ru/page?tema=PHP&show_spisok=PHP»;

В этой строке нам нужно заменить три элемента ..

в общем не важно сколько будет у вас элементов и сколько их вообще нужно заменить в строке!. Поэтому я и люблю эту функцию!

Поэтому я и люблю эту функцию!

? & =

Создадим массив с элементами, которые нужно заменить в строке:

$array_replace = array(«&», «?», «=»);

Функция с переменными и массивом будет выглядеть так:

$rezult = str_replace($array_replace, «_», $url) ;

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий