braindeaf

braindeaf

String.replace with anonymous function with multiple matches

I wonder if I can ask a newbie question, maybe..I’m trying to replace

<source>SOMETHING</source>

with

<code><pre>SOMETHING</pre></code>

So I can replace the entire match

iex(14)> String.replace("<source>(aaaM)</source>", ~r/<source>(.*)<\/source>/, fn match-> "<code><pre>#{match}</pre></code>" end)

**"<code><pre><source>(aaaM)</source></pre></code>"** 

But I need access to the first matched element, so (aaaM). Partly because I also want to HTML Escape it as well. Ok, I need to use the match in anonymous function…but..sadly.

iex(15)> String.replace("<source>(aaaM)</source>", ~r/<source>(.*)<\/source>/, fn match, code-> "<code><pre>#{match}</pre></code>" end) 
warning: variable "code" is unused (if the variable is not meant to be used, prefix it with an underscore)
  iex:15

** (FunctionClauseError) no function clause matching in String.replace/4    
    
    The following arguments were given to String.replace/4:
    
        # 1
        "<source>(aaaM)</source>"
    
        # 2
        ~r/<source>(.*)<\/source>/
    
        # 3
        #Function<43.65746770/2 in :erl_eval.expr/5>
    
        # 4
        []
    
    Attempted function clauses (showing 1 out of 1):
    
        def replace(subject, pattern, replacement, options) when is_binary(subject) and is_binary(replacement) or is_function(replacement, 1) and is_list(options)
    
    (elixir 1.13.1) lib/string.ex:1477: String.replace/4

I’m not sure I follow, I’m now supplying 4 arguments. Even if I parenthesises the multiple arguments for the anonymous function. Anyone point out where I am being a dummy?

Many thanks

RobL

Most Liked

LostKobrakai

LostKobrakai

There is the function raw/1, but that also just wraps data into a {:safe, …} tuple. There’s no :raw tagged tuple support afaik.

jazzyer

jazzyer

I’m not sure I fully understand what you want to do, but this example might give you a sense:

def replace_characters(string) do
    to_replace = ["&", "<", ">", "/", "'"]

    String.replace(string, to_replace, fn
      "&" -> "H"
      "<" -> "E"
      ">" -> "L"
      "/" -> "L"
      "'" -> "O"
    end)
  end
iex::1> Module.replace_characters("fdsfd &<>/' dsfds")                              
"fdsfd HELLO dsfds"

Anonimous function is arity 1, that’s why it complains.

TheMaikXX

TheMaikXX

Hello, just a note. The function Phoenix.HTML.html_escape does always return {:safe, content} according to the spec. Because if it finds code, that needs to be escaped, it escapes it.. That tuple is for phoenix rendering where you put this tuple into template, informing it that the given content is already escaped.
There is also {:raw, content} that tells phoenix that you insist on putting the content into final result as-is.

Last Post!

Aetherus

Aetherus

A silly question that bugs me a lot. Why does Regex.replace take a (... -> String.t) as the third argument instead of a ([String.t] -> String.t)?

And, when I run this piece of code

Regex.replace(~r/\b\w+\b/, "hello, world", fn [capture] ->
  String.reverse(capture)
end)

it gives me an error

** (FunctionClauseError) no function clause matching in :erl_eval."-inside-an-interpreted-fun-"/1    
    
    The following arguments were given to :erl_eval."-inside-an-interpreted-fun-"/1:
    
        # 1
        "hello"

So what is a interpreted function?

Where Next?

Popular in Questions Top

hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

Other popular topics Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44778 311
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New

We're in Beta

About us Mission Statement