2015-10-04 3 views
1

Я разрабатываю новостной сайт и позволяю авторам любых статей определять, сколько изображений они хотели бы добавить в статье.Проверка строки содержит несколько фрагментов текста

Чтобы включить изображение, которое им необходимо ввести [image1] в теле содержимого статьи, которое затем преобразуется в изображение src на другой странице.

Я пытаюсь написать фрагмент кода, который проверяет, сколько изображений пользователь вводит вместе с сопровождающими надписями, а затем посмотреть, применили ли они теги [image #] и [caption #] для каждого.

Желаемая функциональность:

Если пользователь выбрал, чтобы загрузить два изображения для статьи, они также должны вставить две подписи. Затем они должны указать [image1] [caption1] и [image2] [caption2], где бы они ни находились в содержании статьи.

Если пользователь разместил изображения и титры в форме, однако не включил правильное количество [image #] и [caption #], я хочу попросить их сделать это, используя strpos(). Однако я стараюсь добиться этого.

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

Cheers, Рич

$z = 1; 
while($z < $caption){ 
if (strpos($articleContent,'[caption$z]') == !false) { 
echo 'You have added all of your caption tags in the article.'; 
$z++; 
} else { 
echo "You have not added all of your [caption#] tags in the article content."; 
exit(); 
} 
} 

Я тогда надеюсь просто C & P равно сосчитать тег [изображение #].

+2

Необходимо использовать двойные кавычки. '$ Z' является буквальным. Также это '! ==', а не '==!'. http://php.net/manual/en/language.operators.comparison.php Кроме того, '$ caption' целое число? – chris85

+0

@ chris85 - правый. Возможно, вам захочется переключить if, чтобы проверить '! Strpos' и переместить печать сообщения об успешном завершении после цикла. – Terminus

+0

Нет, подпись - это текст $ _POST, я исправил! ==, и мне все еще не повезло. Что вы имеете в виду, когда $ z является буквальным? Если я зацикливаюсь и добавляю $ z ++, не следует ли это проверять все до тех пор, пока $ z не наберет количество $ caption? –

ответ

0

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

Решение:

$articleContent = $_POST['articleContent']; 
$imgCount = count($imgTmp1); // Count files array 
$capCount = count($captions); // Count captions array 
$r = 0; 
$c = 0; 

while($r < $imgCount){ 

$i = 1; 
$z = 1; 
$r++; 
$c++; 

$value = "[image$r]"; 
for($check = strpos($articleContent,$value);$i<$imgCount;$i++){ 
} 
if($check !== false){ 
// Your success, if any 
} else { 
echo "<span class='error'>You need to include '$value' into the article content.</span>"; 
exit(); 
} 

$value2 = "[caption$c]"; 
for($check2 = strpos($articleContent,$value2);$z<$capCount;$z++){ 
} 

if($check2 !== false){ 
// Your success, if any 
} else { 
echo "<span class='error'>You need to include '$value2' into the article content.</span>"; 
exit(); 
} 
} 

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

Удачи всем, кто борется с той же проблемой, что и я, благодаря всем остальным за их помощь.

2

Попробуйте preg_match_all()

Если это, как ожидается, всегда быть последовательным строка (например, [image1] [caption1]) вы можете попробовать это так:

<?php 

$articleContent = 'The M-209 is a portable, mechanical cipher machine. 
[image1][caption1] In this photograph, an intermediate gear unit meshes 
with gears adjoining each key wheel. 
[image2][caption2]Visible to the left of the image is the typewheel 
that prints out messages and ciphertext onto paper tape.'; 

// Is something out of place or any captions missing? 
preg_match_all('~(\[image([\d])+\](?!\s*\[caption\\2\]))~i', $articleContent, $matches); 

empty($matches[0]) or die('Please add proper caption to: ' . implode(', ', $matches[0]). '.'); 

?> 

И если, как предполагается, будет куча вещей между двумя соответствующими тегами, (например, [image1] бла 123 да [caption1]) использовать это регулярное выражение вместо:

<?php 

preg_match_all('~(\[image([\d]+)\](?!.*\[caption\\2\]))~i', $articleContent, $matches); 

?> 

А вот другой подход без доклада недостающего номер заголовка ...

<?php 

$articleContent = 'The M-209 is a portable, mechanical cipher 
machine used primarily by the US military in World War II, though 
it remained in active use through the Korean War. 
[image1][caption1] In this photograph, an intermediate gear unit 
meshes with gears adjoining each key wheel. 
[image2][caption2] Visible to the left of the image is the typewheel 
that prints out messages and ciphertext onto paper tape.'; 

preg_match_all('~(\[image[0-9]+\])~i', $articleContent, $images_array); 

if(!empty($images_array[0])) { 

    preg_match_all('~(\[caption[0-9]+\])~i', $articleContent, $captions_array); 

    if(count(array_unique($images_array[0])) > count(array_unique($captions_array[0]))) { 

     echo 'You have not added all of your [caption#] tags in the article content.'; 
     exit; 


    } else { 

     echo 'You have added all of your caption tags in the article.'; 

    } 

} 

?> 
+0

Ницца. Может ли это обработать их несоответствие надписи и изображения #? (На самом деле больше упражнений для OP) – Terminus

+0

С еще несколькими проверками он, безусловно, может. – BornKillaz

2

Это может быть излишним, но мы надеемся, что это дает вам что-то полезное.

<?php 

$article_content = "abc[image1]def[image2]ghi[image5]jkl[image123]mno" . 
    "[imagex]pqr[image3stu[image10]vwximage4]yza[caption3]bcd[caption1]" . 
    "efg[caption2]hij[caption5]klm[caption123]nop[caption10]qrs[image100]"; 


function find_tags($content, $tag_name) { 
    $tag_length = strlen($tag_name); 
    $ids = []; 
    $position = 0; 
    while(($position = strpos($content, "[" . $tag_name, $position)) !== false) { 
     $end_position = strpos($content, "]", $position); 
     if(is_numeric($id = substr($content, $position + $tag_length + 1, $end_position - $position - $tag_length - 1))) { 
      $ids[] = $id; 
     } 
     $position++; 
    } 
    return $ids; 
} 

function match_ids($tag_ids) { 

    $tag_names = array_keys($tag_ids); 

    sort($tag_ids[$tag_names[0]]); 
    sort($tag_ids[$tag_names[1]]); 

    $missing_ids_in_0 = array_diff(
     $tag_ids[$tag_names[1]], 
     $tag_ids[$tag_names[0]] 
    ); 
    $missing_ids_in_1 = array_diff(
     $tag_ids[$tag_names[0]], 
     $tag_ids[$tag_names[1]] 
    ); 
    return array(
     $tag_names[0] . "_missing" => $missing_ids_in_0, 
     $tag_names[1] . "_missing" => $missing_ids_in_1 
    ); 
} 

$tag_ids = array(
    "image" => find_tags($article_content, "image"), 
    "caption" => find_tags($article_content, "caption") 
); 
var_dump($tag_ids); 

$match_result = match_ids($tag_ids); 
var_dump($match_result); 
echo "<br>"; 

if(sizeof($match_result["image_missing"])) { 
    foreach($match_result["image_missing"] as $id) { 
     echo "Please add an [image" . $id . "] tag.<br>"; 
    } 
} 
if(sizeof($match_result["caption_missing"])) { 
    foreach($match_result["caption_missing"] as $id) { 
     echo "Please add a [caption" . $id . "] tag.<br>"; 
    } 
} 

?> 

Выход:

array (size=2) 
    'image' => 
    array (size=6) 
     0 => string '1' (length=1) 
     1 => string '2' (length=1) 
     2 => string '5' (length=1) 
     3 => string '123' (length=3) 
     4 => string '10' (length=2) 
     5 => string '100' (length=3) 
    'caption' => 
    array (size=6) 
     0 => string '3' (length=1) 
     1 => string '1' (length=1) 
     2 => string '2' (length=1) 
     3 => string '5' (length=1) 
     4 => string '123' (length=3) 
     5 => string '10' (length=2) 
array (size=2) 
    'image_missing' => 
    array (size=1) 
     2 => string '3' (length=1) 
    'caption_missing' => 
    array (size=1) 
     4 => string '100' (length=3) 

Please add an [image3] tag. 
Please add a [caption100] tag. 
+0

Это довольно пятно. Если вы используете @bornkillaz 'preg_match_all' слегка измененный' preg_match_all ('~ \ ['. $ Tag_name. '([0-9] +) \] ~ i', $ content, $ ids); 'вы можете просто вернуть $ ids [1]; 'в' find_tags'. Кроме того, я уверен, что 'sort' не нужны. +1 – Terminus

+0

Когда я доберусь до компьютера сегодня, я прочитаю все ответы. Спасибо, парни. –

+0

Это действительно работало, но оно соответствует количеству тегов [caption] с тегами [image]. Функциональность заключается в том, что когда пользователь вставляет поле загрузки файла, они должны ввести [image1] и [caption1]. Если они полностью забывают вводить их, то и сценарий не знает, куда помещать изображение надписи, если они никогда не выходят. Благодарю вас. –