#php #function #preg-replace
#php #функция #preg-replace
Вопрос:
Я пишу функцию, которая берет содержимое $_POST
, вставляет его в строку, а затем возвращает результирующую строку
На вопрос «Какой ваш любимый цвет?» пользователь вводит blue
на вопрос «Какое ваше любимое животное?» пользовательские вводы dog
$content = "The visitor's favorite color is {color}";
$content = sentenceBuilder($content);
$content = "The visitor's favorite animal is a {animal}";
$content = sentenceBuilder($content);
function sentenceBuilder($content){
global $_POST;
foreach($_POST as $key => $value){
if($key=='color'){
$content = preg_replace("/{($key )}/", $value, $content);
}
if($key=='animal'){
$content = preg_replace("/{($key )}/", $value, $content);
}
}
return $content;
}
Это возвращает «Любимый цвет посетителя — синий» и «Любимое животное посетителя — собака». Если они оставляют элемент color пустым, он возвращает «Любимый цвет посетителя » и «Любимое животное посетителя — собака». Если они оставляют оба элемента пустыми, возвращается 2 неполных предложения.
Итак, я попытался изменить его, чтобы сказать, что если $value
оно пустое, функция просто пропустит его и перейдет к следующему (так как при этом используется каждый элемент формы, который переместился в $ _POST)…
if($key=='color' amp;amp; $value!=''){
$content = preg_replace("/{($key )}/", $value, $content);
}else{
$content ='';
}
if($key=='animal' amp;amp; $value!=''){
$content = preg_replace("/{($key )}/", $value, $content);
}else{
$content ='';
}
С добавлением этого результат, который я получаю, является пустым. Никаких предложений или чего-либо еще. Даже если они заполняют элементы, результат все равно остается пустым с добавлением этого кода.
Поэтому я попробовал это вместо этого.
function sentenceBuilder($content){
global $_POST;
foreach($_POST as $key => $value){
if(isset($value) amp;amp; $value!=''){
if($key=='color'){
$content = preg_replace("/{($key )}/", $value, $content);
}
if($key=='animal'){
$content = preg_replace("/{($key )}/", $value, $content);
}
else{
$content = '';
}
}
return $content;
}
Это дало те же результаты.
TLDR;
Я хочу, чтобы эта функция могла заменять содержимое значениями, которые не являются пустыми, предложением. Те, которые пусты, я бы хотел, чтобы содержимое не отображалось.
Обновить
Я заставил код работать. Однако пришлось переделать его, чтобы это произошло.
<?php
if(isset($_POST)){
$content = "The visitor's favorite color is {color}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor's favorite animal is a {animal} from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from Iowa";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {state}";
echo sentenceBuilder($content);
}
function sentenceBuilder($content){
preg_match("/{(.*?)}/", $content, $checkbrackets);
if(!empty($checkbrackets)){
$gettext = str_replace('{', '', $checkbrackets[0]);
$gettext = str_replace('}', '', $gettext);
if(array_key_exists($gettext,$_POST)){
if(!empty($_POST[$gettext])){
$content = preg_replace("/{($gettext )}/", $_POST[$gettext], $content);
}else{
$content = '';
}
}
}
return $content;
}
?>
<form method="post" action"sentencebuilder.php">
<input type="text" name="color" />
<input type="text" name="animal" />
<input type="text" name="land" />
<input type="submit" />
</form>
Спасибо за помощь, ребята. Введите его, и вы увидите, к чему я стремился. В настоящее время я работаю над этим, чтобы изменить дополнительные скобки, которые существуют в вопросе.
Комментарии:
1. Не существует «одной функции» для «очистки» ввода. «очистка» зависит от контекста. Очистка строки с помощью специфичной для SQL функции совершенно бессмысленна, если строка будет использоваться в контексте HTML. И совет: $ _POST и его родственники являются суперглобальными. Они доступны во всех областях.
global $_POST
бесполезно / избыточно.2. Спасибо за совет. Я понимаю, что очистка зависит от контекста … это то, что я написал для этой функции … на основе контекста. Он очищает содержимое для меня. Я не просил функцию для очистки содержимого, но почему эта функция, которую я написал, не будет обрабатывать пустые значения, отличные от запрошенных.
3. Кроме того, зачем цикл foreach? Зачем перебирать весь массив post и проверять каждый ключ на наличие определенного ключа?
if (isset($_POST[$key]) amp;amp; ($_POST[$key] != '')) { ... }
было бы намного эффективнее.4. цикл foreach существует, потому что он обрабатывает все, что передается через $ _POST … этот фрагмент, который я дал, — это всего лишь одна крошечная часть, чтобы попытаться разобраться в вещах для людей, которые могут быть в состоянии помочь. Можете ли вы ответить, почему информация не отображается в соответствии с запросом в исходном сообщении?
5. Вы получаете пробел, когда присутствует цвет?
Ответ №1:
Используйте этот код, определенно, это решение вашей проблемы:-
<?php
$main_content = array();
if(isset($_POST['submit'])) {
unset($_POST['submit']);
$main_content['color'] = "The visitor's favorite color is {color}";
$main_content['dog'] = "The visitor's favorite dog is {dog}";
$main_content['school'] = "The visitor's favorite school is {school}";
$formData = array_filter($_POST);
if(!empty($formData)) {
echo sentenceBuilder($formData, $main_content);
}
}
function sentenceBuilder($formData=null, $main_content=null){
$newContent = "";
foreach ($formData as $key => $value) {
$newVal = "";
$newVal = preg_replace("/{($key )}/", $value, $main_content[$key]);
$newContent .= $newVal.". <br/>";
}
return $newContent;
}
?>
<form method="post" action="#">
<input type="text" name="color" placeholder="color" />
<input type="text" name="dog" placeholder="dog" />
<input type="text" name="school" placeholder="school" />
<input type="submit" name="submit" />
**OUTPUT:**
The visitor's favorite color is RED.
The visitor's favorite dog is BULLDOG.
The visitor's favorite school is CAMPUS SCHOOL.
Комментарии:
1. Оставляя одно поле пустым, возвращает это. Любимый цвет посетителя — {color} Любимое животное посетителя — собака. Я ценю помощь, но это обходит только те, у которых отсутствуют значения. Это только половина проблемы. Цель состоит в том, чтобы вообще не отображать предложение, если ввод был оставлен пустым.
2. Хорошо, вы отредактировали вопрос. 🙂 Позвольте мне перепостить ответ. У меня есть простое решение вашей проблемы.
3. Любимый цвет посетителя — синий. Любимая собака посетителя …. Любимая школа посетителя — лакота. Я оставил dog пустым. Это результат. вот что я хотел бы видеть, когда я оставляю dog one пустым. Любимый цвет посетителя — синий. Любимая школа посетителей — лакота.
4. Можете ли вы написать вывод, чего на самом деле вы хотите:- 1) Любимый цвет посетителя — синий. Любимая собака посетителя … Любимое животное посетителя — собака. —- ИЛИ — 2) Любимый цвет посетителя — синий. Любимое животное посетителя — собака. КАКОЙ ИЗ НИХ ВАМ НУЖЕН?
5. Хорошо, теперь я тебя понял. Я снова редактирую ответ. Пожалуйста, проверьте. И не забудьте проголосовать, если правильно.
Ответ №2:
Надеюсь, это поможет вам
<?php
$content = '';
echo $content = sentenceBuilder($content);
function sentenceBuilder($content){
global $_POST;
$content = "The visitor's favorite color is {key}";
foreach($_POST as $key => $value){
if (isset($_POST[$key]) amp;amp; ($_POST[$key] != '')) {
$content = preg_replace("/{(key )}/", $value, $content);
}
}
if(strpos($content, '{key}') !== false)
return $content='';
else
return $content;
}?>
<form method="post">
<input type="text" name="color" />
<input type="text" name="gh" />
<input type="submit" />
</form>
Если вы хотите сначала color
проверить, попробуйте
if (isset($_POST['color']) amp;amp; ($_POST['color'] != '')) {
$content = preg_replace("/{(key )}/", $value, $content);
}
elseif (isset($_POST[$key]) amp;amp; ($_POST[$key] != '')) {
$content = preg_replace("/{(key )}/", $value, $content);
}
Комментарии:
1. С этим мне тоже не повезло.
Ответ №3:
Я понимаю, что вам действительно нужна функция, а не просто «встроенный» код. В этом случае эта функция сделает свое дело (если я правильно понимаю ваши пожелания).
В комментариях к коду вы найдете некоторые рекомендации.
Надеюсь, это поможет 🙂
function sentenceBuilder($content = '')
{
preg_match_all('/{(.*?)}/', $content, $matches); // Find all {...} matches
$valueMissing = false; // If a POST value is missing, this will be set to TRUE
if(isset($matches[0]) amp;amp; !empty($matches[0])) { // Braces are found
foreach($matches[0] as $id => $match) {
// Note the usage of $matches[0] vs $matches[1]: $matches[0] = '{animal}','{land}', while $matches[1] = 'animal','land' without the braces
$key = (isset($matches[1][$id]) ? $matches[1][$id] : false); // Quick if/else
$postValue = ($key != false ? (isset($_POST[$key]) ? $_POST[$key] : false) : false); // Quick if/else (double)
if($postValue == false) {
$valueMissing = true;
break; // Leave the foreach loop
} else {
$content = str_replace($match, $postValue, $content); // Replace the value
}
}
if($valueMissing) {
return ''; // Return empty string (braces found, but not all values were found in the POST)
}
}
return $content; // Return the content
}
——— ИСХОДНОЕ СООБЩЕНИЕ ———
Предварительная замена кажется немного излишней для этого, isset() и empty() сделают свое дело.
<?php
if(isset($_POST) amp;amp; !empty($_POST))
{
// Start with empty content
$content = '';
// Only add content (.=) when the field is set (posted) and NOT empty
if(isset($_POST['color']) amp;amp; !empty($_POST['color'])) {
$content .= "The visitor's favorite color is " .$_POST['color']. "<br/>";
}
if(isset($_POST['animal']) amp;amp; isset($_POST['land']) amp;amp; !empty($_POST['animal']) amp;amp; !empty($_POST['land'])) {
$content .= "The visitor's favorite animal is a " .$_POST['animal']. " from " .$_POST['land']. "<br/>";
}
if(isset($_POST['state']) amp;amp; !empty($_POST['state'])) {
$content .= "The visitor is from " .$_POST['state']. "<br/>";
}
if(isset($_POST['number']) amp;amp; !empty($_POST['number'])) {
$content .= "The visitor's favorite number is " .$_POST['number']. "<br/>";
}
// If there is some content, show it
if(!empty($content))
{
echo $content;
}
else
{
echo "Please fill in some values!";
}
}
else
{
?>
<form method="post" action"<?php echo $_SERVER['PHP_SELF']; ?>">
Favorite color: <input type="text" name="color" /><br />
Favorite animal: <input type="text" name="animal" /><br />
from land: <input type="text" name="land" /><br />
<br />
Favorite number: <select name="number">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<input type="submit" value="SEND this form" />
</form>
<?php }
И вы можете использовать HTMLPurifier (например) для «фильтрации» любых вводимых пользователем данных. http://htmlpurifier.org /
Комментарии:
1. То, что вы опубликовали, хотя и полезно для передачи переменных при отправке, не будет полезно для функции, которую я пишу. Preg replace — это именно то, что нужно функции для выполнения ее задачи. Код, который я опубликовал, чтобы получить помощь, был лишь незначительным примером проблемы, с которой я столкнулся. Тем не менее, спасибо за ваш ответ. Я ценю любой вклад, который может быть полезным!
Ответ №4:
Это работает.
<?php
if(isset($_POST)){
$content = "The visitor's favorite color is {color}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor's favorite animal is a {animal} from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {land}";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from Iowa";
echo sentenceBuilder($content);
?> <br/> <?php
$content = "The visitor is from {state}";
echo sentenceBuilder($content);
}
function sentenceBuilder($content){
preg_match("/{(.*?)}/", $content, $checkbrackets);
if(!empty($checkbrackets)){
$gettext = str_replace('{', '', $checkbrackets[0]);
$gettext = str_replace('}', '', $gettext);
if(array_key_exists($gettext,$_POST)){
if(!empty($_POST[$gettext])){
$content = preg_replace("/{($gettext )}/", $_POST[$gettext], $content);
}else{
$content = '';
}
}
}
return $content;
}
?>
<form method="post" action"sentencebuilder.php">
<input type="text" name="color" />
<input type="text" name="animal" />
<input type="text" name="land" />
<input type="submit" />
</form>