1

I have a string like this:

<p>Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt. Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt.</p>

<p><br />Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula ut id elit.lor sit amet, consectetur adipiscing elit. Duis mollis, est non com.</p>

I know how I can get the first paragraph like this:

function getFirstParagraph($string){
    $string = substr($string,0, strpos($string, "</p>")+4);
    return $string;
}

But I have no clue how I can get the second paragraph, can anybody help me with this?

Community
  • 1
  • 1
nielsv
  • 6,540
  • 35
  • 111
  • 215

4 Answers4

3

I would use regex.

function getParagraph($number, $string)
{
    $index = $number-1;

    $matches = [];

    if(!preg_match_all('#<p>(.*?)<\/p>#', $string, $matches))
        throw new Exception('No paragraphs found');

    $matches = $matches[1];
    if(!array_key_exists($index, $matches))
        throw new Exception("Only ".count($matches)." were found, you requested number {$number}");

    return $matches[$index];
}

function getFirstParagraph($string) //Legacy
{
    return getParagraph(1, $string);
}
rdiz
  • 6,136
  • 1
  • 29
  • 41
  • That only works for the first paragraph. When I do getParagraph(2, $string); I get the error "Only 2 were found, you requested number 3". – nielsv Jan 12 '15 at 15:44
  • Try it again now, @Nielsv. – rdiz Jan 12 '15 at 15:50
  • Now getting the error: "Only 1 were found, you requested number 2" – nielsv Jan 12 '15 at 16:12
  • @Dencker You should not use regex in such a case. Your example will break when using `

    ` or `

    ` or `

    ` which are handled well if you use a DOM parser… See: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

    – feeela Jan 12 '15 at 17:29
  • @feeela I agree, but in this case, it *can* be achieved with regex. You could expand it to `#(.*?)<\/p>#`and it won't break as long as you're just looking for paragraphs. – rdiz Jan 12 '15 at 17:45
  • @nielsv are you still using the same piece of text as you provided in the original post? – rdiz Jan 12 '15 at 17:45
1

You could try

$string = "<p>Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt. Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt.</p><p><br />Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula ut id elit.lor sit amet, consectetur adipiscing elit. Duis mollis, est non com.</p>";

    preg_match_all("/\<p\>(.*?)\<\/p\>/", $string, $arrParagraphs);
    $paragraphs=$arrParagraphs[0];

    echo $paragraphs[0]."<br />\n";
    echo $paragraphs[1]."<br />\n";
0

Just use preg_match_all use the code below

<?php
 function getTextBetweenTags($string, $tagname)
 {
    $pattern = "/<$tagname>(.*?)<\/$tagname>/";
    preg_match_all($pattern, $string, $matches);
    return $matches[1];
 }
$array= getTextBetweenTags("

    <p>Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt. Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt.</p>

    <p><br />Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula ut id elit.lor sit amet, consectetur adipiscing elit. Duis mollis, est non com.</p>
", "p"); 
echo $array[1];// will print 2nd para , for first para change $match[2] to $match [1]
?>

Hope this helps you

Utkarsh Dixit
  • 4,267
  • 3
  • 15
  • 38
0

Here is just a simple method:

$test ="<p>Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt. Maecenas laoreet est bibendum, dictum mi vel, cursus mi. Curabitur feugiat libero vitae lorem venenatis consequat. Donec luctus nisi cursus miet sapien blandit, quis congue massa tincidunt.</p>

<p><br />Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula ut id elit.lor sit amet, consectetur adipiscing elit. Duis mollis, est non com.</p>";

explode('</p>', $test);

print_r($test);
The Humble Rat
  • 4,586
  • 6
  • 39
  • 73