Строка заменить текст на PHP

у меня есть

$text = '--ACT-- active --INA-- inactive';

я хочу заменить --ACT- и -INA- на значение, которое я сделал:

str_replace(array('--ACT--','--INA--'), array('<div class = "wp"><b>1</b></div>','<div class = "wp"><b>2</b></div>'), $text);

результаты

<div class = "wp"><b>1</b></div> Active
<div class = "wp"><b>2</b></div> inactive

но я хочу добавить текст активный и неактивный внутри div, а не за его пределами, например:

<div class = "wp"><b>1</b> active</div>

Я не хочу добавлять этот текст в str_replace, я хочу получить его из переменной $ text, нужна помощь?

Затем замените все это: str_replace('--ACT-- active', '<div class = "wp"><b>1</b> Active</div>', $text); (но с массивом для покрытия обоих, как вы уже делаете).

Magnus Eriksson 30.07.2018 13:02

Нет, как я уже сказал, я не хочу добавлять этот текст в str_replace, я все равно хочу получить его из переменной $ text?

John Jack 30.07.2018 13:04

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

Magnus Eriksson 30.07.2018 13:04

В этом случае вам нужно регулярное выражение preg_replace

Andreas 30.07.2018 13:05

@ Андрей, пожалуйста? есть ли способ сделать это без preg_replace, я хочу str_replace

John Jack 30.07.2018 13:07

Невозможно. Могу выложить preg_replace. Но str_replace невозможно или, по крайней мере, чрезвычайно сложно

Andreas 30.07.2018 13:10

ок, как с preg_replace?

John Jack 30.07.2018 13:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
132
5

Ответы 5

Используйте preg_replace, запишите слово после ACT / INA и поместите вокруг него html.

$text = '--ACT-- active --INA-- inactive';

// Add html to active
$text = preg_replace("/--ACT-- (\w+)/" , '<div class = "wp"><b>1</b>$1</div>',$text);

// Add html to inactive and echo
Echo preg_replace("/--INA-- (\w+)/" , '<div class = "wp"><b>2</b>$1</div>',$text);

https://3v4l.org/DdaFt

Предполагается, что это только одно слово после ACT. Если это неверно, обновите свой вопрос более подходящим примером.

спасибо, но как использовать в одной строке, как я сделал в str_replace?

John Jack 30.07.2018 13:14

Вы не можете, поэтому я разместил две строчки. У вас проблема с доверием. Замены не совпадают, поэтому я не могу заменить его тем же html. С активным вы хотите 1 с неактивным 2, я не могу адаптировать код для этого.

Andreas 30.07.2018 13:16

хорошо, извините, потому что проблема, которую я хочу в одной строке, а не две, или ... я ищу другой метод, спасибо andreas

John Jack 30.07.2018 13:19

У вас может быть одна очень грязная строчка Echo preg_replace("/--INA-- (\w+)/" , '<div class = "wp"><b>2</b>$1</div>',preg_replace("/--ACT-- (\w+)/" , '<div class = "wp"><b>1</b>$1</div>',$text));

Andreas 30.07.2018 13:19

нужно повторить preg_match? потому что эта функция имеет низкую скорость, и я не хочу повторять ее дважды.

John Jack 30.07.2018 13:27

@JohnJack "потому что эта функция имеет низкую скорость" - В строках такого размера я сомневаюсь, что вы когда-нибудь заметите какую-либо разницу, если только вы не повторите приведенный выше код многие раз за запрос.

Magnus Eriksson 30.07.2018 13:28

Чтобы избежать цепного выполнения, вы должны окружить шаблоны .*, например /.*--INA-- (\w+).*/.

Theofanis 30.07.2018 13:28

@Theofanis приковал казнь? Что ты имеешь в виду? Это полностью уничтожит регулярное выражение 3v4l.org/v7BMU.

Andreas 30.07.2018 13:46

@Andreas, вам нужно специально выполнить его два раза, повторно подключив предыдущий вывод ко второму, иначе вывод будет недопустимым, как --ACT-- active <div class = "wp"><b>2</b>inactive</div> или <div class = "wp"><b>1</b>active</div> --INA-- inactive

Theofanis 30.07.2018 13:52

@Theofanis - Если вы посмотрите на код, он сначала заменяет ACT, затем он использует этот результат и заменяет INACT (который до сих пор не был заменен). Вы также можете проверить ссылку, которую добавил Андреас. Не знаете, в чем состоит возражение?

Magnus Eriksson 30.07.2018 14:00

@Andreas проверено, и если у него есть два слова после значения, это не сработает, а второе слово будет вне теста div с этим $ text = '--ACT-- active user --INA-- inactive';

John Jack 30.07.2018 16:28

Я знаю. Из ответа: Предполагается, что это только одно слово после ACT. Если это неверно, обновите свой вопрос более подходящим примером.

Andreas 30.07.2018 16:31

Простое решение:

$text = '--ACT-- active --INA-- inactive';
$textAfter= preg_replace('/--ACT-- +(\w+) +--INA-- +(\w+)/',
    '<div class = "wp"><b>1</b>${1}</div> <div class = "wp"><b>2</b>${2}</div>',
    $text);
echo $textAfter;
//prints: <div class = "wp"><b>1</b>active</div> <div class = "wp"><b>2</b>inactive</div>

Основанное на этом полезное решение:

function param($text, $name, $transformation) {
    return preg_replace("/.*$name +(\w+).*/",$transformation, $text);
}
$text = '--ACT-- active --INA-- inactive';

echo param($text,'--ACT--','<div class = "wp"><b>1</b>${1}</div>');
//prints: <div class = "wp"><b>1</b>active</div>

echo param($text,'--INA--','<div class = "wp"><b>2</b>${1}</div>');
//prints: <div class = "wp"><b>2</b>inactive</div>

для первого, если у меня их три, что мне писать в preg_replace? "/ - ACT-- + (\ w +) + - INA-- + (\ w +) + - EDI-- + (\ w +) /" правильно?

John Jack 30.07.2018 16:05

@JohnJack Исправьте и соответственно измените замену, например, $textAfter = preg_replace('/--ACT-- +(\w+) +--INA-- +(\w+) +--EDI-- +(\w+)/', '<div class = "wp"><b>1</b>${1}</div> <div class = "wp"><b>2</b>${2}</div> <div class = "wp"><b>3</b>${3}</div>', $text);

Theofanis 30.07.2018 16:08

спасибо, но что-то пропустил и не работает, работает только если одно слово после значения, но если это $ text = '--ACT-- active --INA-- неактивный пользователь'; не работает? какие-либо предложения?

John Jack 30.07.2018 16:23

@JohnJack заменяет (\w+) на ((\w+\s?)+), поэтому $textAfter = preg_replace('/--ACT-- +((\w+\s?)+) +--INA-- +((\w+\s?)+) +--EDI-- +((\w+\s?)+)/', '<div class = "wp"><b>1</b>${1}</div> <div class = "wp"><b>2</b>${3}</div> <div class = "wp"><b>3</b>${6}</div>', $text);

Theofanis 30.07.2018 17:07

$ text = '--ACT-- активный --INA-- неактивный пользователь --EDI-- Забаненный пользователь'; протестируйте с этим, и вы увидите, что это не работает. что не так?

John Jack 30.07.2018 18:48

@JohnJack, извините за ошибку, измените эту часть <div class = "wp"><b>3</b>${6}</div> с этой заменой, параметры должны увеличиться на два, начиная с 1

Theofanis 31.07.2018 11:11

спасибо за все ваши ответы. да, это то, что я уже сделал, и это работает. но я все еще изучаю, как это сделать таким образом str_replace (array ('- ACT -', '- INA--'), array ('<div class = "wp"> <b> 1 < / b> </div> ',' <div class = "wp"> <b> 2 </b> </div> '), $ text); надеюсь найти что-то, потому что preg_replace немного медленнее .. я хочу использовать str_replace

John Jack 31.07.2018 16:37

Этот шаблон удалит текст между -- и вставит следующий текст в ваш <div>:

$text = '--ACT-- active --INA-- inactive';

$new_text = preg_replace(
    '/((--[A-Z]{3}--) (\w+))/',
    '<div class = "wp"><b>1</b> ${3}</div>',
    $text
);

echo $new_text;

Это неверно. Он запрашивает другой вывод для каждого параметра <b>1</b>, <b>2</b>.

Theofanis 30.07.2018 13:32

Ну что ж, извините. Это было мое первое регулярное выражение, я постараюсь получить то, что вы ищете, как можно скорее.

AymDev 30.07.2018 13:44

Альтернативный (не рекомендуется) метод с одним вызовом preg_replace при отсутствии дубликатов

$text = '--ACT-- active --INA-- inactive';
$text = preg_replace('/ *--(\w+)-- */', '&$1=', trim($text)); // transform to url params
parse_str($text, $data);
var_dump($data);
/* Output
array(2) {
    ["ACT"]=>
  string(6) "active"
    ["INA"]=>
  string(8) "inactive"
}
*/
function format($data,$key,$transformation) {
    $parts = explode('%%', $transformation);
    return $parts[0].$data[$key].$parts[1];
}
echo format($data,'ACT','<div class = "wp"><b>1</b>%%</div>');
//prints: <div class = "wp"><b>1</b>active</div>
echo format($data,'INA','<div class = "wp"><b>2</b>%%</div>');
//prints: <div class = "wp"><b>2</b>inactive</div>

@JohnJack Вы можете сделать это с str_replace, выполнив https://3v4l.org/lj6ct

$text = '--ACT-- active --INA-- inactive user --EDI-- Banned user';
$text = str_replace(array('--ACT--','--INA--','--EDI--','%%'), array('<div class = "wp"><b>1</b>','%%<div class = "wp"><b>2</b>','%%<div class = "wp"><b>3</b>','</div>'), $text.'%%');
print $text;
//prints: <div class = "wp"><b>1</b> active </div><div class = "wp"><b>2</b> inactive user </div><div class = "wp"><b>3</b> Banned user</div>

Это ужасная идея, но она работает.

@JohnJack Не знаю, как это объяснить. Я просто смотрю на это, и это кажется неправильным. Но убедитесь, что на входе нет %%, иначе вы должны изменить последний поисковый запрос и соответствующие замены.

Theofanis 31.07.2018 19:15

Другие вопросы по теме