---
title: "preg_replace – Enbart behålla det som matchar mönstret"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/190967-preg-replace-enbart-behålla-det-som-matchar-mönstret"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "prplxr"
published: "2012-12-12T11:18:18.000Z"
updated: "2012-12-12T15:24:17.000Z"
replies: 11
views: 811
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/190967-preg-replace-enbart-behålla-det-som-matchar-mönstret"
---

# preg_replace – Enbart behålla det som matchar mönstret

## #1 — prplxr, 2012-12-12T11:18Z

Hejsan, svejsan!

Sitter och klurar lite med RegExp. Har kunnat det bra förr, men nu är det som bortblåst så jag försöker lära mig det på nytt.

Jag har ett formulär med två fält som representerar början och slutet av mitt mönster respektive. Hur får jag min preg_replace att kasta bort allt förutom just det som matchas av mitt mönster?

Denna kod har jag nu, och jag ser ju hur fel det är, men det är där jag är just nu:

```php
preg_replace('/('.$str1.')(.*?)('.$str2.')/', "$2<br /><br />", $file)
```

Hur går jag vidare med detta?

Permalänk: https://www.webforum.nu/p/190967

## #2 — metalboy, 2012-12-12T11:42Z

Antingen kan du matcha allt före och efter det du är intresserad av med **.\***, eller så kan du använda [preg_match](http://www.php.net/preg_match) / [preg_match_all](http://www.php.net/preg_match_all) och där skicka med även parameter tre.

```php
<?php
$string = 'Behåll bara det som står inom "citationstecken", släng resten';

// Med preg_replace
echo preg_replace('/.*"(.*?)".*/s', '$1', $string);

echo '<br />';

// Med preg_match
if (preg_match('/"(.*?)"/', $string, $matches)) {
    echo $matches[1];
}
```

Permalänk: https://www.webforum.nu/p/2306698

## #3 — prplxr, 2012-12-12T11:51Z

Inte riktigt så simpelt, detta. Jag läser in en HTML-fil och vill söka reda på träffar enligt mitt mönster i den. Till exempel vill jag hitta alla "\<strong\>allehanda text\</strong\>" så matar jag in "\<strong\>" i första fältet i formuläret och "\</strong\>" i andra.

Prövade med följande kod, men stötte på patrull:

```php
if (preg_match('/('.$str1.')(.*?)('.$str2.')/', $file, $matches)) {
  for ($i=0; $i<count($matches); $i++) {
    echo "${matches[$i]}<br /><br />";
  }
}
```

Detta outputtar första träffen två gånger (och sedan inget mer) av någon anledning, trots att det i dokumentet jag testar med finns tre träffar.

Dessutom vill jag inte ha med själva mönstret i mina träffar, bara själva texten innanför mönstret.

Permalänk: https://www.webforum.nu/p/2306699

## #4 — metalboy, 2012-12-12T11:56Z

Då får du använda preg_match_all istället för preg_match.

```php
<?php

$file = 'Blabla <strong>Behåll</strong> blabla <strong>detta också</strong> blabla <strong>och det här</strong>.';
$str1 = '<strong>';
$str2 = '</strong>';

if (preg_match_all('#('.$str1.')(.*?)('.$str2.')#', $file, $matches)) {
  for ($i=0; $i<count($matches[1]); $i++) {
    echo "{$matches[2][$i]}<br /><br />";
  }
}
```

Permalänk: https://www.webforum.nu/p/2306700

## #5 — prplxr, 2012-12-12T12:07Z

> **[metalboy skrev:](https://www.webforum.nu/p/1557184)**
>
> Då får du använda preg_match_all istället för preg_match.

Jag går och skäms en stund för att jag inte visste detta. Nu har jag iaf något att jobba med! Tusen tack!

(Dessutom såg jag typon i min kod också. Undrar varför jag inte fick något felmeddelande från den förrän jag försökte nå den tredimensionella arrayen.)

Permalänk: https://www.webforum.nu/p/2306702

## #6 — prplxr, 2012-12-12T14:53Z

Jag tog bort lösningsmarkeringen då jag upptäckt att det inte alls fungerar som jag tänkt.

Om jag matar in till exempel "\<p\>\<b\>" och "\<p\>&nbsp;\<\\/p" så hittar den ingenting, även om det finns i texten. Är det något mer jag totalt missar? Det här BORDE JU fungera. Eller?

```php
if (preg_match_all('#('.$str1.')(.*?)('.$str2.')#', $file, $matches)) {
  for ($i=0; $i<count($matches[1]); $i++) {
    echo "<span class=\"msg\" style=\"font-size: 12px;\">Match #".($i+1).":</span><br /><div class=\"match\">" . htmlspecialchars($matches[2][$i]) ."</div>";
    echo $i < (count($matches[1])-1) ? "<br />" : "";
  }
} else {
  echo "<span class=\"msg\">Now THAT's what I call a steam horse! No matches found!</span>";
}
```

Alltså, den visar "Now THAT's...".

Permalänk: https://www.webforum.nu/p/2306708

## #7 — metalboy, 2012-12-12T15:03Z

Hur ser datat i $file ut?

Permalänk: https://www.webforum.nu/p/2306710

## #8 — prplxr, 2012-12-12T15:06Z

Där har jag laborerat med en massa olika filer. Tagit mer eller mindre komplexa dokument från lite varstans på nätet. Den jag labbar med just nu är <http://www.avigsidan.com/avigsidan/avigt001.html>. Kika på källkoden så ser du.

Permalänk: https://www.webforum.nu/p/2306711

## #9 — metalboy, 2012-12-12T15:13Z

Kan du ge exempel på något du vill plocka ut där? Och hur dina $str1 och $str2 ser ut när du vill plocka ut det datat.

Permalänk: https://www.webforum.nu/p/2306713

## #10 — metalboy, 2012-12-12T15:19Z

Är det HTML du vill ha ut information ur så kanske det är enklare att använda någon HTML-parser, t.ex. [DOMDocument](http://www.php.net/domdocument) eller [Simple HTML Dom Parser](http://simplehtmldom.sourceforge.net/).

Permalänk: https://www.webforum.nu/p/2306714

## #11 — prplxr, 2012-12-12T15:19Z

Säg att jag vill ha alla poster på sidan. Jag tittar på källkoden och kommer fram till att det skulle fungera att använda mönstret \</b\>\</p\> och \<p\>\<img src och använder således dessa som $str1 och $str2. Detta ger lite konstiga resultat, tycker jag.

\[ EDIT \]

Men ju mer jag tittar på det, desto mer inser jag att det faktiskt kan vara så att mönstret finns på fler ställen än jag tidigare trott.

Permalänk: https://www.webforum.nu/p/2306715

## #12 — prplxr, 2012-12-12T15:24Z

> **[prplxr skrev:](https://www.webforum.nu/p/1557201)**
>
> Säg att jag vill ha alla poster på sidan. Jag tittar på källkoden och kommer fram till att det skulle fungera att använda mönstret \</b\>\</p\> och \<p\>\<img src och använder således dessa som $str1 och $str2. Detta ger lite konstiga resultat, tycker jag.
> 
> \[ EDIT \]
> 
> Men ju mer jag tittar på det, desto mer inser jag att det faktiskt kan vara så att mönstret finns på fler ställen än jag tidigare trott.

> **[metalboy skrev:](https://www.webforum.nu/p/1557200)**
>
> Är det HTML du vill ha ut information ur så kanske det är enklare att använda någon HTML-parser, t.ex. [DOMDocument](http://www.php.net/domdocument) eller [Simple HTML Dom Parser](http://simplehtmldom.sourceforge.net/).

Kikar lite på detta! Kan vara aktuellt. Jag vet inte exakt vilka förutsättningar jag har ännu.

Permalänk: https://www.webforum.nu/p/2306716

---

Tråden på webben: https://www.webforum.nu/amne/php/190967-preg-replace-enbart-behålla-det-som-matchar-mönstret
